Documentazione di PostgreSQL 9.0 > Programmazione del server > PL/pgSQL - Linguaggio procedurale SQL
PrecedenteLinguaggi proceduraliStruttura di PL/pgSQLSuccessivo

39. PL/pgSQL - Linguaggio procedurale SQL

39.1. Panoramica

PL/pgSQL è un linguaggio procedurale caricabile nel sistema di database PostgreSQL™. Gli obiettivi del design di PL/pgSQL erano di creare un linguaggio caricabile che

  • potesse essere usato per creare funzioni e procedure trigger,

  • aggiungesse strutture di controllo al linguaggio SQL,

  • potesse svolgere calcoli complessi,

  • ereditasse tutti i tipi, le funzioni e gli operatori definiti dall'utente,

  • potesse essere definito per essere trusted dal server,

  • fosse facile da usare.

Funzioni create con PL/pgSQL possono essere usate ovunque possano essere usate funzioni incorporate. Per esempio, è possibile creare funzioni di calcolo condizionale complesse e successivamente usarle per definire operatori o usarle in espressioni di indice.

In PostgreSQL™ 9.0 e successivi, PL/pgSQL è installato in maniera predefinita. Comunque è ancora un modulo caricabile, per questo amministratori particolarmente attenti alla sicurezza potrebbero decidere di rimuoverlo.

39.1.1. Vantaggi dell'utilizzo di PL/pgSQL

SQL è il linguaggio che PostgreSQL™ e la maggior parte degli altri database relazioni usano come linguaggio di interrogazione. È portabile e facile da imparare. Ma ogni istruzione SQL dev'essere eseguita individualmente dal server database.

Questo significa che l'applicazione client deve mandare ogni query al server database, aspettare che sia elaborata, ricevere ed elaborare il risultato, eseguire alcuni calcoli, quindi mandare ulteriori query al server. Tutto questo genera comunicazione tra processi e genererà anche overhead di rete se il client è su una macchina differente rispetto al server database.

Con PL/pgSQL si può raggruppare un blocco di calcolo e una serie di query all'interno del server database, avendo quindi la potenza di un linguaggio procedurale e la facilità d'uso dell'SQL, ma con considerevole risparmio di overhead di comunicazione client/server.

  • Sono eliminati i giri aggiuntivi tra il client e il server

  • I risultati intermedi non necessari al client non devono essere smistati o trasferiti tra il server e il client

  • Possono essere evitati molteplici stadi di parsing delle query

Questo risulta in un incremento di prestazioni considerevole se confrontato con un'applicazione che non usa funzioni immagazzinate.

Inoltre, con PL/pgSQL si possono usare tutti i tipi di dato, gli operatori e le funzioni di SQL.

39.1.2. Argomenti supportati e tipi di dato risultanti

Le funzioni scritte in PL/pgSQL possono accettare come argomenti qualsiasi tipo scalare o array supportato dal server, e possono restituire un risultato di qualsiasi di quei tipi. Possono anche accettare o restituire qualsiasi tipo composto (tipo riga) specificato dal nome. È inoltre possibile dichiarare una funzione PL/pgSQL che restituisce un record, che significa che il risultato è un tipo riga le cui colonne sono determinate dalle specifiche nella query chiamante, come discusso in Sezione 7.2.1.4, «Funzioni di tabella».

Le funzioni PL/pgSQL possono essere dichiarate per accettare un numero variabile di argomenti usando VARIADIC. Questo funziona esattamente allo stesso modo delle funzioni SQL, come discusso in Sezione 35.4.5, «SQL Functions with Variable Numbers of Arguments».

Le funzioni PL/pgSQL possono inoltre essere dichiarate per accettare e restituire tipo polimorfi anyelement, anyarray, anynonarray e anyenum. Gli effettivi tipi di dato gestiti da una funzione polimorfa possono variare da chiamata a chiamata, come discusso in Sezione 35.2.5, «Tipi polimorfici». Un esempio è mostrato in Sezione 39.3.1, «Dichiarazione di parametri di funzione».

Funzioni PL/pgSQL possono anche essere dichiarate per restituire un «insieme» (o tabella) di qualsiasi tipo di dato che può essere restituito come singola istanza. Tale funzione genera il suo output eseguendo RETURN NEXT per ogni elemento desiderato dell'insieme risultato, o usando RETURN QUERY per mostrare in output il risultato della valutazione della query.

Infine, una funzione PL/pgSQL può essere dichiarata per restituire void se non ha valori di ritorno utili.

Funzioni PL/pgSQL possono anche essere dichiarate con parametri di output al posto di una dichiarazione esplicita del tipo di ritorno. Questo non aggiunge nessuna capacità fondamentale al linguaggio, ma spesso è conveniente, specialmente per restituire molteplici valori. La notazione RETURNS TABLE può essere usata al posto di RETURNS SETOF.

Esempi specifici appaiono in Sezione 39.3.1, «Dichiarazione di parametri di funzione» e Sezione 39.6.1, «Ritorno da una funzione».

Documentazione di PostgreSQL 9.0 > Programmazione del server > PL/pgSQL - Linguaggio procedurale SQL
PrecedenteLinguaggi proceduraliStruttura di PL/pgSQLSuccessivo