Quando eseguiamo una query, possiamo avere come risultato una tupla o una serie di tuple. Con gli strumenti analizzati fin’ora, a meno di aggiornamenti massivi in tabella, riusciamo a gestire al meglio solo le singole tuple. Il PL/SQL però, mette a disposizione uno strumento potente per la gestione di query che restituiscono una serie di tuple. Questo strumento è il cursore.
Fondamentalmente abbiamo due tipi di cursore, in questo capitolo analizzeremo i cosidetti cursori espliciti, nel prossimo invece tratteremo i cursori impliciti e faremo qualche approfondimento.
Come vedremo, un cursore può essere immaginato come una variabile complessa; così come si fa per variabili, costanti, eccezioni e quant’altro, esso deve essere esplicitamente dichiarato nella sezione di dichiarazione.
DECLARE
...;
<strong>CURSOR</strong> nome_cursore <strong>IS</strong>
<strong>SELECT</strong> ...
<strong>FROM</strong> ...;
BEGIN
Istruzione1;
...;
END;
Una volta dichiarato, un cursore, per essere utilizzato, deve essere aperto, valorizzato ed infine chiuso. La prima operazione da eseguire sul cursore è, quindi, la sua apertura. Aprire un cursore comporta l’esecuzione della query ad esso associata. Per aprire un cursore scriveremo:
<strong>OPEN</strong> nome_cursore;
A seguito dell’istruzione di OPEN, il cursore sarà posizionato prima della riga iniziale. A questo punto potremo valorizzare il nostro cursore, potremo cioè scorrere la nostra serie di tuple, assegnare una singola tupla ad una variabile per poterla elaborare comodamente. Questa operazione viene effettuata col comando seguente:
<strong>FETCH</strong> nome_cursore <strong>INTO</strong> mia_variabile;
Chiaramente mia_variabile deve essere stata precedentemente definita e deve essere del tipo idoneo a contenere la nostra tupla. Quindi, come vedremo nell’esempio, dato che la FETCH ci restituisce una tupla alla volta, dovremo utilizzare un ciclo per scorrere tutte le tuple. Una volta utilizzato, il cursore dovrà essere chiuso nel seguente modo:
<strong>CLOSE</strong> nome_cursore;
Ricapitolando, il nostro blocco di codice sarà qualcosa del tipo:
DECLARE
...;
CURSOR cur_anagrafica IS
SELECT Nome, Cognome, Stipendio, Ruolo
FROM Anagrafica;
rec_anagrafica Anagrafica%ROWTYPE;
BEGIN
Istruzione1;
OPEN cur_anagrafica;
LOOP
FETCH cur_anagrafica INTO rec_anagrafica;
istruzione2;
...;
END LOOP;
CLOSE cur_anagrafica;
END;
Per i cursori espliciti, Oracle mette a disposizione una serie di attributi che consentono un migliore utilizzo degli stessi. Vediamoli:
- %ISOPEN – booleano, ritorna TRUE se il cursore risulta aperto;
- %FOUND – booleano, ritorna TRUE se la FETCH più recente ha restituito delle righe;
- %NOTFOUND – booleano, ritorna TRUE se la FETCH più recente non ha restituito delle righe;
- %ROWCOUNT – numerico, ritorna il numero totale di righe restituite;