DO
$do$
BEGIN
IF EXISTS (SELECT FROM orders) THEN
DELETE FROM orders;
ELSE
INSERT INTO orders VALUES (1,2,3);
END IF;
END
$do$
Não há elementos procedurais no SQL padrão. O
IF
A instrução faz parte da linguagem procedural padrão PL/pgSQL. Você precisa criar uma função ou executar uma instrução ad-hoc com o DO
comando. Você precisa de um ponto e vírgula (
;
) no final de cada instrução em plpgsql (exceto para o END
final ). Você precisa de
END IF;
no final do IF
demonstração. Uma sub-seleção deve estar entre parênteses:
IF (SELECT count(*) FROM orders) > 0 ...
Ou:
IF (SELECT count(*) > 0 FROM orders) ...
Isso é equivalente e muito mais rápido, no entanto:
IF EXISTS (SELECT FROM orders) ...
Alternativa
O
SELECT
adicional Não é necessário. Isso faz o mesmo, mais rápido:DO
$do$
BEGIN
DELETE FROM orders;
IF NOT FOUND THEN
INSERT INTO orders VALUES (1,2,3);
END IF;
END
$do$
Embora improvável, transações simultâneas gravadas na mesma tabela podem interferir. Para ter certeza absoluta, bloqueie a tabela na mesma transação antes de continuar conforme demonstrado.