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 ...