Visitatori: 5224
La potenza del PL/SQL è in gran parte dovuta alla possibilità di utilizzare i cursori.
Un cursore gestisce l’accesso a un indirizzo di memoria in cui sono memorizzati i record risultanti dall’esecuzione di un comando SQL e consente di manipolare singolarmente ciascuna delle righe restituite da una SELECT.
I CURSORI possone essere ESPLICITI O IMPLICITI.
Rappresentano dei comandi sql predefiniti che restituiscono diversi record e vengono gestiti in modo esplicito dallo sviluppatore attraverso i comandi OPEN, FETCH, CLOSE..
Carica i record estratti attraverso l'istruzione SQL specificata.
Restituisce una riga prelevandola dall'insieme di righe selezionate e memorizzandola in un tipo record o in un insieme di variabili in base a quanto specificato nella clausola INTO.
Chiude il cursore e rilascia la memoria che quest'ultimo stava utilizzando.
Vengono creati implicitamente dall'istruzione SQL e restituiscono una riga , altrimenti viene generata un'eccezione. (Quando assegniamo il valore di una variabile come risultato di una query SQL stiamo creando implicitamente un CURSORE).
I cursori sono essenzialmente delle variabili, quindi anch'essi vanno dichiarati nella sezione DECLARE del nostro blocco PL/SQL.
Essenzialmente per utilizzare un cursore dobbiamo eseguire tre operazioni:
- Apertura attraverso il comando Open
- Lettura dei record attraverso il comando Fetch
- Chiusura del Cursore attraverso il comando Close
DECLARE
nome VARCHAR(30);
cognome VARCHAR(30);
num_esami INT;
CURSOR studenti IS
SELECT nome_studente, cognome_studente, esami_sostenuti
FROM STUDENTI,
WHERE anno_corso=1;
BEGIN
OPEN studenti;
END;
Fino ad ora abbiamo visto come un cursore viene dichiarato e la sua apertura all'interno del blocco. L'apertura abbiamo detto che carica i record estratti dall'istruzione SQL. L'insieme di queste righe viene definito ACTIVE SET.
Per elaborare questi dati si utilizza il comando FETCH. IL comando ci consente di scorrere i record presenti nell'active set e assegnare ogni record o riga alle variabili o al tipo record definiti in precedenza nella sezione DECLARE.
Nel nostro esempio attraverso il comando FETCH caricheremo le righe nella variabili nome, cognome e num_esami.
DECLARE
nome VARCHAR(30);
cognome VARCHAR(30);
num_esami INT;
num_stud_promossi_2_anno INT;
CURSOR studenti IS
SELECT nome_studente, cognome_studente, esami_sostenuti
FROM STUDENTI,
WHERE anno_corso=1;
BEGIN
num_stud_promossi_2_anno := 0;
OPEN studenti;
Loop
FETCH studenti into nome, cognome, num_esami;
IF num_esami >= 5 THEN
num_stud_promossi_2_anno := num_stud_promossi_2_anno +1;
END IF;
End Loop
CLOSE studenti;
END;
Nell'esempio abbiamo utilizzato un cursore esplicito per scorrere l'ACTIVE SET rappresentato dagli studenti del primo anno. Se lo studente ha superato un totale di esami almeno pari a 5 viene promosso al 2 anno. In questo caso tuttavia il blocco PL/SQL ricava il numero di studenti promossi ma non tiene alcuna traccia dei loro dati. LA maggior parte di voi avrà notato che potevamo ottenere lo stesso risultato semplicemente con l'istruzione:
SELECT count(*)
FROM STUDENTI
WHERE esami_sostenuti >=5;
Chiaramente ciò è vero ma non era questo lo scopo. L'esempio anche se relativamente semplice mostra tutte le fasi dell'utilizzo di un CURSORE, dalla sua dichiarazione, appertura, fetching dei dati, chiusura del Cursore.
Più avanti vedremo come creare procedure più complesse attraverso i CURSORI PL/SQL.
Lezione precedente | Indice degli articoli | Lezione successiva

|