PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

SQL dinâmico (EXECUTE) como condição para instrução IF


Esta construção não é possível:

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

Você pode simplificar para:
IF EXISTS (SELECT 1 FROM mytable) THEN ...

Mas seu exemplo provavelmente é simplificado. Para SQL dinâmico executado com EXECUTE , leia o manual aqui. Você pode verificar a variável especial FOUND imediatamente após executar qualquer comando DML para ver se alguma linha aqui foi afetada:
IF FOUND THEN ...

No entanto:

Observe em particular que EXECUTE altera a saída de GET DIAGNOSTICS , mas não altera FOUND .

Minha ênfase em negrito. Para um EXECUTE simples faça isso em vez disso:
...
DECLARE
   i int;
BEGIN
   EXECUTE 'SELECT 1 FROM mytable';  -- something dynamic here

   GET DIAGNOSTICS i = ROW_COUNT;

   IF i > 0 THEN ...

Ou se for oportuno - em particular com apenas resultados de linha única - use o INTO cláusula com EXECUTE para obter um resultado da consulta dinâmica diretamente. Cito o manual aqui:

Se uma linha ou lista de variáveis ​​for fornecida, ela deve corresponder exatamente à estrutura dos resultados da consulta (quando uma variável de registro for usada, ela se configurará para corresponder à estrutura do resultado automaticamente). Se várias linhas forem retornadas, apenas a primeira será atribuída ao INTO variável. Se nenhuma linha for retornada, NULL será atribuído ao INTO variável(eis).
...
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 ...