
Procedurální jazyk PG/SQL
Procedurální jazyk databáze POSGRESQL se označuje jako PG/SQL nebo také plpgsql a od PL/SQL databáze ORACLE se odlišuje v několika bodech. Předně databáze POSTGRESQL podporuje pouze uživatelské funkce, nikoliv procedury. Nicméně pomocí funkcí lze dosáhnou stejného efektu jako pomocí procedur v PL/SQL.
Funkce PG/SQL definujeme následovně:
CREATE FUNCTION nejaka_funkce() RETURNS NUMERIC AS $$
DECLARE
promenna NUMERIC := 30;
BEGIN
RAISE NOTICE 'Promenna obsahuje cislo %', promenna;
-- % je ve vypisu nahrazeno obsahem promenne
RETURN promenna;
END;
$$ LANGUAGE plpgsql;
Na příkladu lze vidět některé odlišnosti (červeně) v syntaxi oproti PL/SQL. Celý procedurální kód je uzavřen mezi symboly "$$", na konci je pak navíc specifikace použitého jazyka za klíčovým slovem LANGUAGE. Deklarace proměnných je uvozena klíčovým slovem DECLARE. Příkaz RAISE, který v ORACLE slouží výhradně pro vyvolání výjimky, se v POSTGRESQL využívá i k zobrazení zpráv. RAISE NOTICE pouze zobrazí specifikovaný text, zatímco RAISE EXCEPTION vyvolá výjimku.
Operátor přiřazení (:=) je shodná s PL/SQL, stejně jako podmínkové konstrukce IF-ELSIF-ELSE. Podporovány jsou taktéž smyčky LOOP a WHILE. Smyčka FOR pro procházení řádků výsledku SQL dotazu má drobné odlišnosti od verze v PL/SQL:
CREATE OR REPLACE FUNCTION smycka() RETURNS integer AS $$
DECLARE
k RECORD;
BEGIN
FOR k IN SELECT * FROM patients LOOP
RAISE NOTICE 'pacient %', k.patient_id;
END LOOP;
RETURN 1;
END;
$$ LANGUAGE plpgsql;
Předně proměnná použitá jako vektor musí být deklarována jako každá jiná proměnná, datový typ pro kurzor je RECORD. Druhý drobnější rozdíl je, že SQL dotaz ve FOR smyčce není třeba uzavírat do závorek.
Uživatelskou funkci voláme jako standardní funkce pomocí SQL dotazů. Pokud chceme jen vynutit její spuštění, použijeme konstrukci:
SELECT nazev_funkce() FROM GENERATE_SERIES(1,1)
nebo zkrácenou variantu
SELECT nazev_funkce()
Tento SQL dotaz zajistí právě jedno spuštění uživatelské funkce.
Co se týká výjimek, je způsob jejich zachytávání shodný s PL/SQL, liší se pouze seznam možných typů systémových výjimek.