In PL/SQL si definisce funzione un blocco di codice dotato di un nome attraverso il quale viene salvata e può essere richiamata da altri blocchi PL/SQL, da altre procedure e da altre funzioni.
Le funzioni, del tutto simili alle procedure, si differenziano da queste per la RETURN che specifica il tipo di dato restituito, infatti esse restituiscono sempre un valore. La sintassi della definizione di una funzione è la seguente:<strong>CREATE</strong> [or REPLACE] <strong>FUNCTION</strong> <<strong>nome_funzione</strong>> [(<lista di parametri>)] <strong>RETURN</strong> <<strong>tipo dato</strong>> IS
<dichiarazione>
BEGIN
<sequenza di istruzioni>
RETURN <variabile>
[exception
<routine di gestione dell'eccezione>]
END [<nome funzione>];
Come di consueto andiamo ad analizzare la sintassi: La clausola CREATE FUNCTION, obbligatoria, indica che stiamo definendo una funzione. La clausola [or REPLACE], opzionale, serve per ricreare la funzione nel caso in cui essa è già stata definita in precedenza. La clausola <nome_funzione>, obbligatoria, indica il nome con cui la funzione sarà identificata. La clausola [(<lista parametri>)], opzionale, consente di inserire una serie di parametri che possono essere passati alla funzione. In pratica è una sequenza del tipo:
<nome_parametro> [IN | OUT | IN OUT] <tipo_dato>
In merito a tale sequenza valgono le stesse osservazioni viste nella lezione precedente dedicata alle procedure. La clausola RETURN, <tipo dato> specifica il tipo di dato che la funzione dovrà restituire. La clausola IS assolve, come nelle procedure, una funzione analoga alla clausola DECLARE vista in precedenza. Per il resto vale quanto già visto nella trattazione dei blocchi.
Una funzione, come la procedura, può essere richiamata utilizzando il comando CALL nel seguente modo:
<strong>CALL nome_funzione</strong>([lista parametri]);
Anche le funzioni possono essere eliminate tramite il comando DROP nel seguente modo:
<strong>DROP nome_funzione</strong>;
Un esempio pratico di funzione PL/SQL
Supponiamo, di voler effettuare una query sulla nostra tabella di "Anagrafica" al fine di calcolare l’ammontare totale degli stipendi che dovranno essere erogati ogni mese. Un semplice esempio di funzione preposta a tale compito potrebbe essere il seguente:
CREATE FUNCTION totale_stipendi() RETURN number IS
tot_stipendi number := null;
BEGIN
SELECT sum(stipendio) INTO tot_stipendi FROM Anagrafica;
RETURN tot_stipendi;
END;
Per utilizzarla, all’interno del nostro blocco dovremo avere qualcosa del tipo:
DECLARE
totale_stipendi_mensile number;
BEGIN
Totale_stipendi_mensile := totale_stipendi();
END;
Sostanzialmente, la differenza con le procedure è che il risultato di una chiamata di funzione deve essere assegnato ad una variabile appositamente definita.