sql >> Database >  >> RDS >> PostgreSQL

Dynamische SQL (EXECUTE) als voorwaarde voor IF-statement

Deze constructie is niet mogelijk:

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

U kunt vereenvoudigen tot:

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

Maar uw voorbeeld is waarschijnlijk vereenvoudigd. Voor dynamische SQL uitgevoerd met EXECUTE , lees hier de handleiding. U kunt de speciale variabele FOUND . controleren onmiddellijk na het uitvoeren van een DML-opdracht om te zien of er rijen zijn die hier invloed op hebben:

IF FOUND THEN ...

Maar:

Merk in het bijzonder op dat EXECUTE verandert de uitvoer van GET DIAGNOSTICS , maar verandert niet FOUND .

Vetgedrukte nadruk van mij. Voor een eenvoudige EXECUTE doe dit in plaats daarvan:

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

   GET DIAGNOSTICS i = ROW_COUNT;

   IF i > 0 THEN ...

Of indien opportuun - in het bijzonder met alleen resultaten van één rij - gebruik de INTO clausule met EXECUTE om direct een resultaat van de dynamische query te krijgen. Ik citeer hier de handleiding:

Als er een rij- of variabelenlijst wordt gegeven, moet deze exact overeenkomen met de structuur van de resultaten van de query (wanneer een recordvariabele wordt gebruikt, zal deze zichzelf configureren om automatisch overeen te komen met de resultaatstructuur). Als er meerdere rijen worden geretourneerd, wordt alleen de eerste toegewezen aan deINTO variabel. Als er geen rijen worden geretourneerd, wordt NULL toegewezen aan de INTO variabele(n).

...
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. Hoe verwijder ik nieuwe regeltekens uit gegevensrijen in mysql?

  2. Waarom de INCLUDE-clausule gebruiken bij het maken van een index?

  3. ORA-03135 – RMAN Duplicaat

  4. Nog een argument voor opgeslagen procedures