PL/pgSQL
PL/pgSQL ehk PostgreSQL-i protseduuriline keel (Procedural Language/PostgreSQL) on PostgreSQL andmebaasi sisse ehitatud programmeerimiskeel, mis imiteerib Oracle PL/SQL võimalusi.
PostgreSQL võimaldab kasutada ka mitmeid teisi keeli võimaldamaks nendes kirjutatud funktsioonide täitmine PostgreSQL kontekstis: PL/Java, PL/Perl, PL/php, PL/Python, PL/Ruby ja nii mõnedki teised veel. Protseduuriliste keelte käitamine andmebaasimootoris võimaldab vältida mitmekordset andmete laadimist edasi-tagasi andmebaasi ja eessüsteemi (frontend) vahel.
PL/pgSQL keele omapära võrreldes teiste PostgreSQL jaoks pakendatud keeltega seisneb ka selles, et andmebaasimootoril on võimalus selle jaoks genereeritud masinkoodi optimeerida, saavutades seega parema jõudluse.
Suuremahuliste funktsioonide käitamisel andmebaasis on aga ka pahupool - kirjutamisoperatsioonid lukustavad tabeliridu või koguni terve tabeli. Seetõttu võib mõne funktsiooni täitmine tõsta latentsused eessüsteemis niivõrd kõrgeks, et eessüsteem on hoopiski kasutuskõlbmatu.
CREATE FUNCTION ruutu(integer) RETURNS int AS $$
BEGIN
RETURN $1 * $1;
END;
$$ LANGUAGE plpgsql;
Funktsioonide välja kutsumine on sama mis sisse-ehitatud funktsioonide puhulgi:
SELECT ruutu(2);
ruutu
-------
4
(1 row)
Pisut keerukamas näites kasutame tabelist pärit andmeid:
-- Loome risttahukate mõõtmete tabeli
CREATE TABLE risttahukad (laius int, korgus int, pikkus int);
-- Sisestame mõned näidisandmed tabelisse
INSERT INTO risttahukad (laius, korgus, pikkus) VALUES (3,4,5);
INSERT INTO risttahukad (laius, korgus, pikkus) VALUES (9,8,7);
INSERT INTO risttahukad (laius, korgus, pikkus) VALUES (7,6,5);
Tüüpiline SQL lause risttahuka ruumala arvutamiseks oleks järgnev:
SELECT laius * korgus * pikkus AS "ruumala" FROM risttahukad;
Annab vasteks:
ruumala
---------
60
504
210
(3 rows)
Kasutades PL/pgSQL-i defineerime eelnevalt funktsiooni:
-- Defineerime funktsiooni ruumala
CREATE FUNCTION ruumala(int, int, int) RETURNS int AS $$
BEGIN
RETURN $1 * $2 * $3;
END;
$$ LANGUAGE plpgsql;
Ning seejärel kutsume välja ruumala funktsiooni SELECT lauses:
SELECT ruumala(laius, korgus, pikkus) FROM risttahukad;
Nagu näha, on tulemus täpselt sama:
ruumala
---------
60
504
210
(3 rows)
Peale teatud loogika kapseldamise funktsioonidesse toetab PL/pgSQL ka:
Kontrollstruktuure nagu if-else blokid, tsükklid, erindid jms