Oracle Procedure memorizzate e funzioni PL/SQL con esempi
⚡ Riepilogo intelligente
I subprogrammi PL/SQL sono blocchi, procedure e funzioni denominati, memorizzati nel database e richiamati per nome. Una procedura esegue un processo e una funzione restituisce un valore, scambiandosi dati tramite i parametri IN, OUT e IN OUT e la parola chiave RETURN.

Che cosa sono i subprogrammi PL/SQL?
In questo tutorial, viene descritta in dettaglio la procedura per creare ed eseguire i blocchi, le procedure e le funzioni specificati.
Procedure e funzioni sono sottoprogrammi che possono essere creati e salvati nel database come oggetti di database. Possono essere richiamati o referenziati anche all'interno di altri blocchi.
Trattiamo anche le principali differenze tra questi due sottoprogrammi e ne discutiamo Oracle funzioni integrate.
Terminologie nei sottoprogrammi PL/SQL
Prima di approfondire i sottoprogrammi PL/SQL, esamineremo la terminologia specifica che li caratterizza.
Parametro
Un parametro è una variabile o un segnaposto di qualsiasi valore valido Tipo di dati PL/SQL tramite il quale il sottoprogramma PL/SQL scambia valori con il codice principale. Questo parametro consente l'input ai sottoprogrammi e l'extraczione di valori da loro.
- Questi parametri dovrebbero essere definiti insieme ai sottoprogrammi al momento della creazione.
- Sono inclusi nell'istruzione di chiamata per interagire con i sottoprogrammi.
- Il tipo di dati del parametro nella sottoprogramma e nell'istruzione chiamante deve essere lo stesso.
- La dimensione del tipo di dati non deve essere specificata al momento della dichiarazione del parametro, poiché la dimensione è dinamica.
In base al loro scopo, i parametri vengono classificati come:
- Parametro IN
- Parametro OUT
- Parametro IN OUT
Parametro IN
- Utilizzato per fornire input ai sottoprogrammi.
- Si tratta di una variabile di sola lettura all'interno dei sottoprogrammi; il suo valore non può essere modificato all'interno del sottoprogramma.
- Nell'istruzione di chiamata, può trattarsi di una variabile, un valore letterale o un'espressione, come '5*8' o 'a/b'.
- Per impostazione predefinita, i parametri sono di tipo IN.
Parametro OUT
- Utilizzato per ottenere l'output dai sottoprogrammi.
- Si tratta di una variabile di lettura e scrittura all'interno dei sottoprogrammi; il suo valore può essere modificato al loro interno.
- Nell'istruzione di chiamata, dovrebbe sempre essere una variabile a contenere il valore proveniente dalla sottoprogramma.
Parametro IN OUT
- Utilizzato sia per fornire input che per ricevere output dai sottoprogrammi.
- Si tratta di una variabile di lettura e scrittura all'interno dei sottoprogrammi; il suo valore può essere modificato al loro interno.
- Nell'istruzione di chiamata, dovrebbe sempre essere una variabile a contenere il valore proveniente dalla sottoprogramma.
Il tipo di parametro deve essere specificato al momento della creazione dei sottoprogrammi.
RITORNO
RETURN è la parola chiave che indica al compilatore di passare il controllo dalla sottoprogramma all'istruzione chiamante. In una sottoprogramma, RETURN significa semplicemente che il controllo deve uscire dalla sottoprogramma; una volta che il controllore trova RETURN, il codice successivo viene saltato.
Normalmente, il blocco principale chiama i sottoprogrammi e il controllo passa dal blocco principale al sottoprogramma chiamato. L'istruzione RETURN all'interno del sottoprogramma restituisce il controllo al blocco principale. Nel caso delle funzioni, l'istruzione RETURN restituisce anche un valore, il cui tipo di dati è specificato al momento della dichiarazione della funzione.
Che cos'è una procedura in PL/SQL?
A Procedura In PL/SQL, una subprogram unit è costituita da un gruppo di istruzioni PL/SQL che possono essere chiamate per nome. Ogni procedura ha un nome univoco ed è memorizzata nel file Oracle database come oggetto database.
Nota: Un sottoprogramma non è altro che una procedura e deve essere creato manualmente in base alle esigenze. Una volta creato, viene memorizzato come oggetto del database.
Le caratteristiche di un'unità di sottoprogramma procedura in PL/SQL sono:
- Le procedure sono blocchi autonomi che possono essere memorizzati nel banca dati.
- Possono essere richiamati tramite il loro nome per eseguire le istruzioni PL/SQL.
- Vengono utilizzati principalmente per eseguire un processo.
- Possono contenere blocchi annidati, oppure essere annidati all'interno di altri blocchi o pacchetti.
- Contengono una parte di dichiarazione (facoltativa), una parte di esecuzione e una parte di gestione delle eccezioni (facoltativa).
- I valori possono essere passati a una procedura o recuperati da essa tramite parametri.
- Questi parametri dovrebbero essere inclusi nell'istruzione di chiamata.
- Una procedura può avere un'istruzione RETURN per restituire il controllo al blocco chiamante, ma non può restituire alcun valore tramite RETURN.
- Le procedure non possono essere richiamate direttamente dalle istruzioni SELECT; possono essere richiamate da un altro blocco o tramite la parola chiave EXEC.
Sintassi
CREATE OR REPLACE PROCEDURE <procedure_name> ( <parameter1 IN/OUT <datatype> .. . ) [ IS | AS ] <declaration_part> BEGIN <execution part> EXCEPTION <exception handling part> END;
- L'istruzione CREATE PROCEDURE indica al compilatore di creare una nuova procedura. La parola chiave 'OR REPLACE' indica di sostituire la procedura esistente (se presente) con quella corrente.
- Il nome della procedura deve essere univoco.
- La parola chiave 'IS' viene utilizzata quando la stored procedure è annidata all'interno di un altro blocco. Se la procedura è autonoma, si utilizza 'AS'. A parte questa convenzione di codifica, entrambe hanno lo stesso significato.
Esempio 1: Creazione di una procedura e sua chiamata tramite EXEC. In questo esempio creiamo un Oracle Procedura che accetta un nome come input e stampa un messaggio di benvenuto come output, utilizzando il comando EXEC per richiamarla.
CREATE OR REPLACE PROCEDURE welcome_msg (p_name IN VARCHAR2) IS BEGIN dbms_output.put_line ('Welcome '|| p_name); END; / EXEC welcome_msg ('Guru99');
Code Spiegazione:
- Code riga 1: Creazione della procedura denominata 'welcome_msg' e con un parametro 'p_name' di tipo 'IN'.
- Code riga 4: Stampa il messaggio di benvenuto concatenando il nome inserito.
- La procedura è stata compilata correttamente.
- Code riga 7: Chiamata della procedura tramite EXEC con il parametro 'Guru99'. La procedura viene eseguita e stampa "Benvenuto Guru99 ".
Che cos'è una funzione?
Una funzione è un sottoprogramma PL/SQL autonomo. Come una procedura, una funzione ha un nome univoco e viene memorizzata come oggetto del database PL/SQL. Le sue caratteristiche sono:
- Le funzioni sono blocchi indipendenti utilizzati principalmente per i calcoli.
- Una funzione utilizza la parola chiave RETURN per restituire un valore, il cui tipo di dati è definito al momento della creazione.
- Una funzione deve restituire un valore o generare un'eccezione; il valore di ritorno è obbligatorio nelle funzioni.
- Una funzione senza istruzioni DML può essere chiamata direttamente in una query SELECT, mentre una funzione con istruzioni DML può essere chiamata solo da altri blocchi PL/SQL.
- Può contenere blocchi annidati, oppure essere annidato all'interno di altri blocchi o pacchetti.
- Contiene una parte di dichiarazione (facoltativa), una parte di esecuzione e una parte di gestione delle eccezioni (facoltativa).
- I valori possono essere passati alla funzione o recuperati da essa tramite parametri.
- Questi parametri dovrebbero essere inclusi nell'istruzione di chiamata.
- Una funzione può restituire un valore anche tramite i parametri OUT, oltre che tramite RETURN.
- Poiché restituisce sempre un valore, l'istruzione chiamante utilizza sempre un operatore di assegnazione per popolare una variabile.
Sintassi
CREATE OR REPLACE FUNCTION <function_name> ( <parameter1 IN/OUT <datatype> ) RETURN <datatype> [ IS | AS ] <declaration_part> BEGIN <execution part> EXCEPTION <exception handling part> END;
- CREATE FUNCTION indica al compilatore di creare una nuova funzione. OR REPLACE indica di sostituire la funzione esistente (se presente) con quella corrente.
- Il nome della funzione deve essere univoco.
- È necessario specificare il tipo di dati RETURN.
- La parola chiave 'IS' viene utilizzata quando la funzione è annidata all'interno di un altro blocco. Se la funzione è autonoma, si utilizza 'AS'.
Esempio 1: Creazione di una funzione e sua chiamata tramite un blocco anonimo. In questo programma, creiamo una funzione che accetta un nome come input e restituisce un messaggio di benvenuto, utilizzando un blocco anonimo e un'istruzione SELECT per richiamarla.
CREATE OR REPLACE FUNCTION welcome_msg_func ( p_name IN VARCHAR2) RETURN VARCHAR2 IS BEGIN RETURN ('Welcome '|| p_name); END; / DECLARE lv_msg VARCHAR2(250); BEGIN lv_msg := welcome_msg_func ('Guru99'); dbms_output.put_line(lv_msg); END; / SELECT welcome_msg_func('Guru99') FROM DUAL;
Code Spiegazione:
- Code riga 1: Creazione della funzione denominata 'welcome_msg_func' e con un parametro 'p_name' di tipo 'IN'.
- Code riga 2: Dichiarazione del tipo di ritorno come VARCHAR2.
- Code riga 5: Restituisce il valore concatenato 'Welcome' e il valore del parametro.
- Code riga 8: Blocco anonimo per richiamare la funzione sopra descritta.
- Code riga 9: Dichiarazione della variabile con lo stesso tipo di dati del tipo di ritorno della funzione.
- Code riga 11: Chiamata della funzione e assegnazione del valore restituito alla variabile 'lv_msg'.
- Code riga 12: Stampa il valore della variabile. L'output è "Benvenuto Guru99 ".
- Code riga 14: Richiamando la stessa funzione tramite un'istruzione SELECT. Il valore restituito viene indirizzato all'output standard.
Somiglianze tra una procedura e una funzione
- Entrambi possono essere richiamati da altri blocchi PL/SQL.
- Se un'eccezione sollevata nel sottoprogramma non viene gestita nel suo gestione delle eccezioni sezione, si propaga al blocco chiamante.
- Entrambi possono avere tutti i parametri richiesti.
- Entrambi sono trattati come oggetti di database in PL/SQL.
Procedura vs. funzione: differenze chiave
| Procedura | Funzione |
|---|---|
| Utilizzato principalmente per eseguire un determinato processo. | Utilizzato principalmente per eseguire alcuni calcoli. |
| Non può essere richiamato in un'istruzione SELECT. | Una funzione che non contiene istruzioni DML può essere chiamata in un'istruzione SELECT. |
| Utilizza un parametro OUT per restituire un valore. | Utilizza RETURN per restituire un valore. |
| Non è obbligatorio restituire un valore. | È obbligatorio restituire un valore. |
| Il comando RETURN semplicemente esce dal sottoprogramma. | RETURN interrompe il controllo del sottoprogramma e restituisce il valore. |
| Il tipo di dati restituiti non è specificato al momento della creazione. | Il tipo di dati restituiti è obbligatorio al momento della creazione. |
Funzioni integrate in PL/SQL
PL / SQL Contiene diverse funzioni integrate per lavorare con i tipi di dati stringa e data. Qui vediamo le funzioni più comunemente utilizzate e il loro utilizzo.
Funzioni di conversione
Queste funzioni integrate convertono un tipo di dati in un altro.
| Nome della funzione | Impiego | Esempio |
|---|---|---|
| TO_CHAR | Converte un altro tipo di dati in un tipo di dati carattere. | TO_CHAR(123); |
| DATA_A_COME_COME (stringa, formato) | Converte la stringa data in una data. La stringa deve corrispondere al formato specificato. | TO_DATE('2015-GEN-15', 'AAAA-LUN-GG'); Uscita: 1 / 15 / 2015 |
| TO_NUMBER (testo, formato) | Converte il testo in un numero nel formato specificato. In tale formato, '9' indica il numero di cifre. | Seleziona TO_NUMBER('1234′,'9999') da doppio; Uscita: 1234. Seleziona TO_NUMBER('1,234.45','9,999.99') da dual; Uscita: 1234.45 |
Funzioni di stringa
Queste funzioni vengono utilizzate sul tipo di dati carattere.
| Nome della funzione | Impiego | Esempio |
|---|---|---|
| ISTRUZIONE(testo, stringa, inizio, occorrenza) | Restituisce la posizione di un testo specifico all'interno della stringa data. text è la stringa principale, string è il testo da cercare, start è la posizione iniziale (facoltativa) e occurrence è il numero di occorrenze della stringa cercata (facoltativa). | Seleziona INSTR('AEROPLANE','E',2,1) da dual; Uscita: 2. Seleziona INSTR('AEROPLANE','E',2,2) da dual; Uscita: 9 (seconda occorrenza di E) |
| SUBSTR (testo, inizio, lunghezza) | Restituisce il valore della sottostringa della stringa principale. text è la stringa principale, start è la posizione iniziale e length è la lunghezza della sottostringa da estrarre. | seleziona substr('aeroplane',1,7) da dual; Uscita: aeropla |
| MAIUSCOLO (testo) | Restituisce la versione in maiuscolo del testo fornito. | Seleziona upper('guru99') da dual; Uscita:GURU99 |
| INFERIORE (testo) | Restituisce la versione minuscola del testo fornito. | Seleziona lower('AerOpLane') da dual; Uscita: aereo |
| INITCAP (testo) | Restituisce il testo specificato con la lettera iniziale di ogni parola in maiuscolo. | Seleziona INITCAP('guru99') da dual; Uscita: Guru99. Seleziona INITCAP('la mia storia') da dual; Uscita: La mia storia |
| LUNGHEZZA (testo) | Restituisce la lunghezza della stringa specificata. | Seleziona LENGTH('guru99') da dual; Uscita: 6 |
| LPAD (testo, lunghezza, carattere di riempimento) | Aggiunge il carattere specificato alla stringa a sinistra fino alla lunghezza totale indicata. | Seleziona LPAD('guru99', 10, '$') da dual; Uscita: $$$$guru99 |
| RPAD (testo, lunghezza, pad_char) | Aggiunge il carattere specificato alla stringa a destra fino alla lunghezza totale indicata. | Seleziona RPAD('guru99′,10,'-') da dual; Uscita:guru99—- |
| LTRIM (testo) | Rimuove gli spazi bianchi iniziali dal testo. | Seleziona LTRIM(' Guru99') da duale; Uscita: Guru99 |
| RTRIM (testo) | Elimina gli spazi bianchi finali dal testo. | Seleziona RTRIM('Guru99 ') da duale; Uscita: Guru99 |
Funzioni data
Queste funzioni vengono utilizzate per manipolare le date.
| Nome della funzione | Impiego | Esempio |
|---|---|---|
| AGGIUNGI_MESI (data, numero di mesi) | Aggiunge i mesi indicati alla data. | AGGIUNGI_MESI('2015-01-01',5); Uscita: 05 / 01 / 2015 |
| SYSDATA | Restituisce la data e l'ora correnti del server. | Seleziona SYSDATE da doppio; Uscita: 10/4/2015 2:11:43 |
| TRUNC | Arrotonda la variabile data al valore più basso possibile. | seleziona sysdate, TRUNC(sysdate) da dual; Uscita: 10/4/2015 2:12:39 PM, 10/4/2015 |
| ROTONDO | Arrotonda la data al limite superiore o inferiore più vicino. | Seleziona sysdate, ROUND(sysdate) da dual; Uscita: 10/4/2015 2:14:34 PM, 10/5/2015 |
| MESI_TRA | Restituisce il numero di mesi tra due date. | Seleziona MONTHS_BETWEEN (sysdate+60, sysdate) da dual; Uscita: 2 |


