Stored procedure
# Stored procedure

Una stored procedure è un programma scritto in SQL o in altri linguaggi, mantenuto nel database stesso, archiviato nel cosiddetto database data dictionary. Spesso è scritta in versioni proprietarie di SQL, che sono dei veri e propri linguaggi strutturati, come il PL/pgSQL di PostgreSQL o il PL/SQL di Oracle, all'interno dei quali è possibile scrivere codice SQL. Generalizzando, a seconda delle loro caratteristiche si distinguono diversi tipi di sottoprogrammi:

| Funzioni | restituiscono un singolo valore oltre ad accettare parametri di ingresso e/o uscita |
| - | - |
| Procedure | non restituiscono valori ma accettano parametri di ingresso e/o uscita |
| Trigger | sono attivati da eventi |

Generalmente il DBMS compila le stored procedure, il che significa che le ottimizza e stabilisce il piano di esecuzione delle query.

Alcuni DBMS consentono di criptare le stored procedure. Questa pratica viene usata dai produttori di software per fare in modo che il cliente non possa leggerle. Questo modo di distribuire il software è detto closed source, il cui codice cioè deve restare segreto per evitare che venga studiato o modificato.

## Vantaggi e svantaggi

I principali vantaggi che derivano dall'utilizzo delle stored procedure sono i seguenti:

* La stored procedure evita al client di riscrivere query complesse offrendo la possibilità di richiamare una procedura archiviata all'interno del database.
* Di conseguenza anche il numero di informazioni che saranno scambiate tra client e server sarà minore a tutto vantaggio delle prestazioni.
* Trattandosi di linguaggi strutturati, diventano possibili elaborazioni complesse non altrimenti realizzabili usando unicamente query SQL.
* La compilazione di una stored procedure avviene una volta sola, al suo inserimento. Ogni volta che la procedura viene richiamata viene semplicemente eseguita e questo aumenta significativamente le prestazioni.
* L'utilizzo di stored procedure permette di mantenere librerie di funzioni da utilizzare all'interno del database stesso. Potenzialmente si potrebbe eseguire ogni operazione richiamando una diversa procedura, senza conoscere la struttura di un database magari complesso, o avendone una conoscenza limitata.
* Proprio per questo motivo, l'amministratore di database può a volte evitare di concedere i permessi di modifica o di lettura su molte tabelle a determinati utenti, concedendo semplicemente il permesso di eseguire le stored procedure.

Gli svantaggi principali sono invece i seguenti:

* Le stored procedure aumentano il carico di lavoro per il server.
* A volte non si può utilizzare il linguaggio che si vorrebbe utilizzare, perché il DBMS non lo supporta.
* La logica del programma viene spostata sul server; questo non è necessariamente uno svantaggio, ma non è compatibile con il modello logico di applicativi a tre livelli.

## Linguaggi

I linguaggi utilizzabili per la scrittura delle stored procedure sono molti e dipendono dal DBMS che si utilizza. I più diffusi sono sicuramente Java e C/C++. I DBMS offrono anche versioni strutturate di SQL in modo che possa essere utilizzato per scrivere procedure che contengano condizioni e cicli. I più famosi sono:

* PL/pgSQL (PostgreSQL)
* PL/SQL (Oracle)
* SQL PL (DB2)
* Transact-SQL (SQL Server)
* MySQL

## Estensioni procedurali di SQL

Sebbene lo standard SQL:2003 preveda diversi costrutti che fanno di SQL un linguaggio procedurale, i DBMS che implementano le Stored Procedure tendono a utilizzare estensioni specifiche, o a basarsi sulle implementazioni più diffuse anziché sullo standard. A ciò si aggiunge il fatto che i DBMS più leggeri non implementano affatto le Stored Procedure o altri tipi di routine. Per questi motivi, i costrutti procedurali sono quella parte dell'SQL più soggetta a variazioni quando si passa da un dialetto all'altro.

Le estensioni procedurali di SQL comprendono:

* costrutti per il controllo del flusso;
   * controllo condizionale;
   * cicli;
* cursori;
* gestione degli errori.
