Tato konstrukce není možná:
IF EXECUTE 'EXISTS (SELECT 1 FROM mytable)' THEN ...
Můžete zjednodušit na:
IF EXISTS (SELECT 1 FROM mytable) THEN ...
Ale váš příklad je pravděpodobně zjednodušený. Pro dynamické SQL provedené pomocí EXECUTE
, přečtěte si návod zde. Můžete zkontrolovat speciální proměnnou FOUND
ihned po provedení jakéhokoli příkazu DML, abyste zjistili, zda to ovlivnilo některé řádky:
IF FOUND THEN ...
Nicméně:
Všimněte si zejména, že
EXECUTE
změní výstupGET DIAGNOSTICS
, ale neměníFOUND
.
Odvážný důraz můj. Pro prosté EXECUTE
udělejte místo toho toto:
...
DECLARE
i int;
BEGIN
EXECUTE 'SELECT 1 FROM mytable'; -- something dynamic here
GET DIAGNOSTICS i = ROW_COUNT;
IF i > 0 THEN ...
Nebo je-li to vhodné – zejména s pouze jednořádkovými výsledky – použijte INTO
klauzule s EXECUTE
získat výsledek z dynamického dotazu přímo. Zde cituji manuál:
Pokud je poskytnut seznam řádků nebo proměnných, musí přesně odpovídat struktuře výsledků dotazu (při použití proměnné záznamu se automaticky nakonfiguruje tak, aby odpovídala struktuře výsledků). Pokud je vráceno více řádků, pouze první bude přiřazen k
INTO
proměnná. Pokud nejsou vráceny žádné řádky, je kINTO
přiřazena hodnota NULL proměnné.
...
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 ...