sql >> Databasteknik >  >> RDS >> PostgreSQL

Dynamisk SQL (EXECUTE) som villkor för IF-satsen

Denna konstruktion är inte möjlig:

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

Du kan förenkla till:

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

Men ditt exempel är förmodligen förenklat. För dynamisk SQL körs med EXECUTE , läs manualen här. Du kan kontrollera den speciella variabeln FOUND omedelbart efter att ha utfört ett DML-kommando för att se om några rader här påverkade:

IF FOUND THEN ...

Men:

Observera särskilt att EXECUTE ändrar utdata för GET DIAGNOSTICS , men ändrar inte FOUND .

Djärv betoning min. För en vanlig EXECUTE gör så här istället:

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

   GET DIAGNOSTICS i = ROW_COUNT;

   IF i > 0 THEN ...

Eller om det är lämpligt - särskilt med endast enradsresultat - använd INTO sats med EXECUTE för att få ett resultat från den dynamiska frågan direkt. Jag citerar manualen här:

Om en rad eller variabellista tillhandahålls måste den exakt matcha strukturen för sökfrågans resultat (när en postvariabel används konfigurerar den sig själv att matcha resultatstrukturen automatiskt). Om flera rader returneras kommer endast den första att tilldelas INTO variabel. Om inga rader returneras tilldelas NULL till INTO variabel(er).

...
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. PGError:ERROR:behörighet nekad för relation (när du använder Heroku)

  2. Postgresql-kolumnen hittades inte, men visas i Beskriv

  3. 2 sätt att få dagen från en dejt i Oracle

  4. Hämta gränsvärdena för en partitionerad tabell i SQL Server (T-SQL)