DO
$do$
BEGIN
IF EXISTS (SELECT FROM orders) THEN
DELETE FROM orders;
ELSE
INSERT INTO orders VALUES (1,2,3);
END IF;
END
$do$
Er zijn geen procedurele elementen in standaard SQL. De IF
statement maakt deel uit van de standaard proceduretaal PL/pgSQL. U moet een functie maken of een ad-hocstatement uitvoeren met de DO
commando.
Je hebt een puntkomma nodig (;
) aan het einde van elke instructie in plpgsql (behalve de laatste END
).
Je hebt END IF;
. nodig aan het einde van de IF
verklaring.
Een subselectie moet tussen haakjes staan:
IF (SELECT count(*) FROM orders) > 0 ...
Of:
IF (SELECT count(*) > 0 FROM orders) ...
Dit is echter equivalent en veel sneller:
IF EXISTS (SELECT FROM orders) ...
Alternatief
De extra SELECT
is niet nodig. Dit doet hetzelfde, sneller:
DO
$do$
BEGIN
DELETE FROM orders;
IF NOT FOUND THEN
INSERT INTO orders VALUES (1,2,3);
END IF;
END
$do$
Hoewel het onwaarschijnlijk is, kunnen gelijktijdige transacties die naar dezelfde tabel schrijven, interfereren. Om absoluut zeker te zijn, vergrendelt u de tafel in dezelfde transactie voordat u verder gaat zoals aangetoond.