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;