sql >> Databáze >  >> RDS >> PostgreSQL

Dynamický SQL (EXECUTE) jako podmínka pro příkaz IF

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ýstup GET 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 k INTO 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 ...


  1. Oracle SQL:Jak používat více než 1000 položek uvnitř klauzule IN

  2. Sloučit tabulku a protokol změn do zobrazení v PostgreSQL

  3. Jak získat seznam všech jazyků v SQL Server (T-SQL)

  4. TSQL – Přidat sloupec do všech tabulek v databázi [Příklad kurzoru]