DO
$do$
BEGIN
IF EXISTS (SELECT FROM orders) THEN
DELETE FROM orders;
ELSE
INSERT INTO orders VALUES (1,2,3);
END IF;
END
$do$
Non ci sono elementi procedurali nell'SQL standard. Il IF
fa parte del linguaggio procedurale predefinito PL/pgSQL. Devi creare una funzione o eseguire un'istruzione ad hoc con DO
comando.
Hai bisogno di un punto e virgola (;
) alla fine di ogni istruzione in plpgsql (tranne per il END
finale ).
Hai bisogno di END IF;
alla fine del IF
dichiarazione.
Una sottoselezione deve essere racchiusa tra parentesi:
IF (SELECT count(*) FROM orders) > 0 ...
Oppure:
IF (SELECT count(*) > 0 FROM orders) ...
Questo è equivalente e molto più veloce, però:
IF EXISTS (SELECT FROM orders) ...
Alternativa
Il SELECT
aggiuntivo non è necessario. Questo fa lo stesso, più velocemente:
DO
$do$
BEGIN
DELETE FROM orders;
IF NOT FOUND THEN
INSERT INTO orders VALUES (1,2,3);
END IF;
END
$do$
Sebbene improbabili, le transazioni simultanee che scrivono sulla stessa tabella possono interferire. Per essere assolutamente sicuro, blocca in scrittura la tabella nella stessa transazione prima di procedere come mostrato.