CREATE [OR REPLACE] FUNCTION jmeno_funkce ([typ_argumentu [, ]])
RETURNS typ_navratove_hodnoty
AS 'definice funkce'
LANGUAGE jmeno_jazyka;
Příkazem CREATE FUNCTION jmeno_funkce vytvoříte
funkci jen v případě, že funkce tohoto jména ještě neexistuje.
Pokud použijete příkaz
CREATE OR REPLACE FUNCTION jmeno_funkce bude
existující funkce stejného jména přepsána. (Přepsat můžete jenom
uživatelské funkce.
K čemu slouží jmeno_funkce je snad jasné. Argument (nebo argumenty) funkce se předávají při použití funkce v závorce oddělené čárkou, a během deklarace funkce musíte určit typ_argumentu. (Například real,string atp.). Funkce nemusí mít žádné argumenty, pak se při deklaraci i použití funkce použijí závorky prázdné.
Za závorkami následuje klíčové slovo RETURNS a typ návratové hodnoty funkce. K čemu je návratová hodnota se ještě dostanu (Programátoři jistě vědí).
Za klíčovým slovem AS je v apostrofech uvedeno tělo funkce. Tělo funkce je v podstatě popis činnosti, kterou má funkce vykonávat. Jak takový popis činosti vypadá, záleží na jazyku, který k popisu činosti použijete.
Za klíčovým slovem LANGUAGE je napsán název jazyka, ketrý jste použili pro definici funkce. Asi Vás už napadlo, že je tomu tak proto, že těch jazyků je více. Například internal,C,SQL,plpsql a další. Jazyky se mohou do databáze přidat pomocí programu createlang (Tento program zde rozhodně nemám v úmyslu rozebírat. Jste-li v Linuxu, můžete se podívat na manuálové stránky). Běžný uživatel má k dispozici jazyk SQL popsaný níže.
Funkce lze také přetěžovat. To znamená, že je možné vytvořit několik funkcí stejného jména lišící se počtem nebo typem argumentů.
Na příkladu je také vydět, jak se argumenty v tělu funkce používají. První argument je označen 1, druhý 2, třetí 3 atd. Návratovou hodnotu vrací funkce pomocí příkazu SELECT (to není moc překvapivé, že?). Funkci nyní přetížíme.rimmer=> CREATE FUNCTION soucet (integer,integer) rimmer-> RETURNS integer rimmer-> AS ' rimmer'> SELECT $1 + $2;' rimmer-> LANGUAGE 'sql'; CREATE
Funkce můžeme volat následovně:rimmer=> CREATE FUNCTION soucet (float,integer) rimmer-> RETURNS float rimmer-> AS ' rimmer'> SELECT $1 + $2;' rimmer-> LANGUAGE 'sql'; CREATE
rimmer=> SELECT soucet (3,-1),soucet (3.4,-1),soucet(-1,3.4);
soucet | soucet | soucet
--------+--------+--------
2 | 2.4 | 2
(1 row)
V prvním případě byla volána funkce soucet(integer,integer) ve
druhém případě soucet(float, integer). Protože jsme však
nedefinovali funkci soucet (integer,float), byla v třetím případě
použita funkce soucet(integer, integer) a číslo typu float (3.4)
bylo Postgresem převedeno na typ integer (3). Někdy by podobné věci
mohli být nebezpečné, prote je třeba si na to dávat pozor.
Poslední ukázka je převzatá z dokumentu xfunc.html, který najdete v Linuxu Debian Woody v adresáři /usr/share/doc/postgresql-doc/html/ (po instalaci balíčku postgresql-doc). V jiných Linuxových distribucích se může adresář mírně lišit (ve Windows to bude úplně jinde). O využití jazyka SQL (a dalších možných jazyků pro vytváření funkcí) se zde dovíte další zajímavosti.
CREATE FUNCTION tp1 (integer, numeric) RETURNS numeric AS '
UPDATE bank
SET balance = balance - $2
WHERE accountno = $1;
SELECT balance FROM bank WHERE accountno = $1;
' LANGUAGE SQL;
