PL/pgSQL functies en procedures
PostgreSQL is een erg uitgebreid systeem, om het nóg uitgebreider te maken heb je de mogelijkheid om je eigen functies te schrijven. Functies in een database zijn erg krachtig en vaak ook snel omdat het rechtstreeks op de server gebeurt. Functies / procedures kunnen worden geschreven in verschillende talen, het is zelfs mogelijk om PHP te gebruiken als taal!!! (zie http://www.commandprompt.com/community/plphp). De meest gebruikte is echter PL/pgSQL.
In een functie kun je gebruik maken van de standaard SQL-mogelijkheden, uitgebreid met foutafhandeling, loops, control-structures etc.
Simpel beginnen: Een sommetje. We maken een functie welke 2 getallen bij elkaar optelt en de uitkomst teruggeeft:
2
3
4
5
BEGIN
RETURN $1+$2;
END;
' LANGUAGE 'plpgsql'
Hiermee wordt de functie “som” aangemaakt (of vervangen indien hij al bestaat). De functie heeft 2 argumenten nodig die beiden van het type INTEGER zijn, de returnwaarde van de functie is ook een INTEGER. Binnen de functie kun je de argumenten benaderen op nummer, welke beginnen bij 1.
De BEGIN en END geven het blok aan waarin bepaalde zaken plaatsvinden. Zo’n blok kan genest worden, variabelen welke je in een blok declareerd kun je in geneste blokken gebruiken maar niet in hoger gelegen blokken, de scope van een variabele beperkt zich dan dus tot het eigen blok en de blokken daarbinnen.
Je kunt deze functie op de volgende manier aanroepen:
Iets uitgebreider: Een wiskundige berekening; de faculteit van een getal berekenen. Bijvoorbeeld: De faculteit van 5 is 120: 5*4*3*2*1 = 120. Dit wordt ook wel geschreven als 5!
In dit voorbeeld komen de blokken en if-statements naar voren:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
DECLARE
getal INTEGER;
BEGIN
getal := $1;
-- Controleer of we een geldig getal krijgen
IF getal IS NULL OR getal<0 THEN
RAISE NOTICE ''Geen geldig getal'';
ELSE
IF getal = 1 THEN
RETURN 1;
ELSE
DECLARE
volgende INTEGER;
BEGIN
volgende := faculteit( getal-1 )*getal;
RETURN volgende;
END;
END IF;
END IF;
END;
' LANGUAGE 'plpgsql';
De aanroep van deze functie gebeurt op deze wijze:
In deze functie wordt een variabele gedeclareerd waarin we de meegegeven waarde opslaan, in een dieper blok genereren we een variabele “volgende” welke we als returnwaarde gebruiken. Je ziet dat dit een recursieve functie is, hij roept zichzelf aan totdat de eindwaarde is bereikt.
De mogelijkheden van functies en procedures in PL/pgSQL zijn echt oneindig, ik raad je aan om er over te lezen op http://www.postgresql.org/docs/8.1/static/plpgsql.html.
Inhoudsopgave
- Inleiding
- Voorbeeld-case
- Overerving in PostgreSQL
- Aanmaken van tabellen en het leggen van relaties
- Views
- PL/pgSQL functies en procedures
- Triggers
- Check constraints en domains
- Conclusie