Documentazione di PostgreSQL 9.0 > Programmazione del server > PL/pgSQL - Linguaggio procedurale SQL > Struttura di PL/pgSQL
PrecedentePL/pgSQL - Linguaggio procedurale SQLDichiarazioniSuccessivo

39.2. Struttura di PL/pgSQL

PL/pgSQL è un linguaggio strutturato a blocchi. Il testo completo della definizione di una funzione deve essere un blocco. Un blocco è definito come:

[ <<label>> ]
[ DECLARE
    declarations ]
BEGIN
    statements
END [ label ];

Ogni dichiarazione e ogni istruzione all'interno di un blocco è terminata da un punto e virgola. Un blocco che appare all'interno di un altro blocco deve avere un punto e virgola dopo END, come mostrato sopra; comunque l'END finale che conclude il corpo di una funzione non richiede un punto e virgola.

[Suggerimento]

Suggerimento

Un errore comunque è di scrivere un punto e virgola immediatamente dopo BEGIN. Questo non è corretto e causerà un errore di sintassi.

Una label è necessaria solo se si vuole identificare il blocco per usarlo in un'istruzione EXIT, o per qualificare i nomi delle variabili dichiarate nel blocco. Se un'etichetta viene fornita dopo END, deve corrispondere all'ettichetta all'inizio del blocco.

Tutte le parole chiave sono insensibili al case. Gli identificatori sono implicitamente convertiti in minuscolo a meno che non siano tra doppi apici, esattamente come nei comandi SQL comuni.

I commenti in PL/pgSQL funzionano allo stesso modo del comune SQL. Un trattino doppio (--) comincia un commento che si estende fino alla fine della linea. Un /* comincia un blocco di commento che si estende fino all'occorrenza corispondente di */. I blocchi commenti possono essere nidificati.

Qualsiasi istruzione nella sezione istruzioni di un blocco può essere un sottoblocco. I sottoblocchi possono essere usati per raggruppare logicamente o localizzare variabili in un piccolo gruppo di istruzioni. Le variabili dichiarate in un sottoblocco mascherano qualsiasi variabile chiamata similarmente di blocchi esterni per la durata del sottoblocco; ma si può accedere comunque le variabili esterne se si qualificano i loro nomi con etichette di blocco.

CREATE FUNCTION somefunc() RETURNS integer AS $$
<< outerblock >>
DECLARE
    quantity integer := 30;
BEGIN
    RAISE NOTICE 'Quantity here is %', quantity;  -- Prints 30
    quantity := 50;
    --
    -- Crea un sottoblocco
    --
    DECLARE
        quantity integer := 80;
    BEgin
        RAISE NOTICE 'Quantity here is %', quantity;  -- Prints 80
        RAISE NOTICE 'Outer quantity here is %', outerblock.quantity;  -- Prints 50
    END;

    RAISE NOTICE 'Quantity here is %', quantity;  -- Prints 50

    RETURN quantity;
END;
$$ LANGUAGE plpgsql;

[Nota]

Nota

Attualmente c'è un «blocco esterno» nascosto che racchiude il corpo di qualsiasi funzione PL/pgSQL. Questo blocco fornisce le dichiarazioni dei parametri di funzione (se presenti), così come alcune variabili speciali tipo FOUND (si veda Sezione 39.5.5, «Ottenere lo stato del risultato»). Il blocco esterno è etichettato con il nome della funzione, quindi i parametri e le variabili speciali possono essere qualificate con il nome della funzione.

È importante non confondere l'uso di BEGIN/END per raggruppare istruzioni in PL/pgSQL con i comandi SQL chiamati similmente per il controllo delle transazioni. BEgin/END di PL/pgSQL sono solo per raggruppamento; essi non cominciano o finiscono una transazione. Funzioni e procedure trigger sono eseguite sempre all'interno di una transazione definita da una query esterna - non possono cominciare o fare il commit di quella transzione, dato che non ci sarebbe contesto per loro in cui essere eseguite. Comunque, un blocco che contiene una clausola EXCEPTION effettivamente forma una sottotransazione di cui si può fare il rollback senza coinvolgere la transazione esterna. Per maggiori informazioni su questo si veda Sezione 39.6.5, «Trapping Errors».

Documentazione di PostgreSQL 9.0 > Programmazione del server > PL/pgSQL - Linguaggio procedurale SQL > Struttura di PL/pgSQL
PrecedentePL/pgSQL - Linguaggio procedurale SQLDichiarazioniSuccessivo