PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Dynamiczny SQL (EXECUTE) jako warunek instrukcji IF

Ta konstrukcja nie jest możliwa:

IF EXECUTE 'EXISTS (SELECT 1 FROM mytable)' THEN ...

Możesz uprościć do:

IF EXISTS (SELECT 1 FROM mytable) THEN ...

Ale twój przykład jest prawdopodobnie uproszczony. Dla dynamicznego SQL wykonywane za pomocą EXECUTE , przeczytaj instrukcję tutaj. Możesz sprawdzić specjalną zmienną FOUND natychmiast po wykonaniu dowolnego polecenia DML, aby sprawdzić, czy dotyczy to jakichkolwiek wierszy:

IF FOUND THEN ...

Jednak:

Zwróć uwagę w szczególności, że EXECUTE zmienia wyjście GET DIAGNOSTICS , ale nie zmienia FOUND .

Moje odważne podkreślenie. Dla zwykłego EXECUTE zrób to zamiast tego:

...
DECLARE
   i int;
BEGIN
   EXECUTE 'SELECT 1 FROM mytable';  -- something dynamic here

   GET DIAGNOSTICS i = ROW_COUNT;

   IF i > 0 THEN ...

Lub jeśli jest to możliwe - w szczególności z wynikami tylko w jednym wierszu - użyj INTO klauzula z EXECUTE aby uzyskać wynik bezpośrednio z zapytania dynamicznego. Cytuję instrukcję tutaj:

Jeśli podana jest lista wierszy lub zmiennych, musi ona dokładnie odpowiadać strukturze wyników zapytania (gdy używana jest zmienna rekordu, skonfiguruje się automatycznie, aby dopasować strukturę wyników). Jeśli zwracanych jest wiele wierszy, tylko pierwszy zostanie przypisany do INTO zmienny. Jeśli nie zostaną zwrócone żadne wiersze, do INTO przypisywana jest wartość NULL zmienne.

...
DECLARE
   _var1 int;  -- init value is NULL unless instructed otherwise
BEGIN

EXECUTE format('SELECT var1 FROM %I WHERE x=y LIMIT 1', 'my_Table')
INTO    _var1;

IF _var1 IS NOT NULL THEN ...


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy istnieje sposób na ustawienie czasu wygaśnięcia, po którym wpis danych jest automatycznie usuwany w PostgreSQL?

  2. PostgreSQL 9.3:Dynamiczna tabela przestawna

  3. Wdrażanie Django + Python 3 + PostgreSQL do AWS Elastic Beanstalk

  4. Mechanizmy replikacji fizycznej w PostgreSQL

  5. Zoptymalizuj zapytanie z PRZESUNIĘCIEM na dużym stole