DO
$do$
BEGIN
IF EXISTS (SELECT FROM orders) THEN
DELETE FROM orders;
ELSE
INSERT INTO orders VALUES (1,2,3);
END IF;
END
$do$
W standardowym SQL nie ma elementów proceduralnych. IF
Instrukcja jest częścią domyślnego języka proceduralnego PL/pgSQL. Musisz utworzyć funkcję lub wykonać instrukcję ad-hoc z DO
polecenie.
Potrzebujesz średnika (;
) na końcu każdej instrukcji w plpgsql (z wyjątkiem końcowego END
).
Potrzebujesz END IF;
na końcu IF
oświadczenie.
Wybór podrzędny musi być otoczony nawiasami:
IF (SELECT count(*) FROM orders) > 0 ...
Lub:
IF (SELECT count(*) > 0 FROM orders) ...
Jest to jednak równoważne i znacznie szybsze:
IF EXISTS (SELECT FROM orders) ...
Alternatywna
Dodatkowy SELECT
nie jest potrzebne. Robi to samo, szybciej:
DO
$do$
BEGIN
DELETE FROM orders;
IF NOT FOUND THEN
INSERT INTO orders VALUES (1,2,3);
END IF;
END
$do$
Chociaż mało prawdopodobne, współbieżne transakcje zapisu do tej samej tabeli mogą przeszkadzać. Aby mieć absolutną pewność, zablokuj tabelę w tej samej transakcji przed kontynuowaniem, jak pokazano.