Cos'è il cursore in Oracle
Oracle Utilizza un'area di lavoro denominata Aree SQL private per eseguire istruzioni SQL e memorizzare informazioni. Un cursore Oracle è un costrutto PL/SQL che consente di assegnare un nome a queste aree di lavoro e di accedere alle informazioni archiviate
Tipi di cursore in Oracle
- Cursore implicito in Oracle
- Cursore esplicito in Oracle
Cursori espliciti
I cursori espliciti hanno le seguenti fasi
1) Dichiara:dichiariamo il nome del cursore e definiamo la struttura della query
2) Open: l'istruzione open esegue la query e associa qualsiasi variabile a cui si fa riferimento. Le righe identificate dalla query sono denominate insiemi attivi. E ora è disponibile per il recupero
Cos'è il set attivo: L'insieme di righe restituito da una query a più righe
La sua dimensione è il numero di righe che soddisfa i tuoi criteri di ricerca
3) Recupero:in questa fase, le righe vengono recuperate dal cursore e, dopo ogni recupero, si testa il cursore per eventuali righe rimanenti, se non ci sono righe si procede alla chiusura del cursore
4) Close:l'istruzione close rilascia l'insieme di righe attivo e possiamo di nuovo aprire il cursore per recuperare l'aggiornamento dell'insieme attivo
Le fasi in dettaglio
Dichiarazione di un cursore
- Nome cursore
- Struttura della query
Syntax: CURSOR IS : It includes most of the usual clauses, but INTO Clause is not allowed Example: DECLARE CURSOR cur1 is SELECT address,salary,emp_no,emp_name FROM emp WHERE region=’US’; ……………………………… BEGIN ……………………………… END;
Apertura di un cursore
Qui viene eseguita l'analisi e l'esecuzione della query. Dopo aver aperto il cursore, le righe restituite dalla query sono disponibili per il recupero.
Syntax: Open <cursor name> This statement is used within the executable section of the block. It also establishes an active set of the rows Example: OPEN cur1; DECLARE v_salary number; CURSOR cur1 is SELECT salary FROM emp WHERE region=’US’; BEGIN OPEN cur1; LOOP FETCH cur1 into v_salary; EXIT WHEN cur1%NOTFOUND; DBMS_OUTPUT.PUT_LINE (v_salary); END LOOP; CLOSE cur1; END; /
Il cursore punterà ora alla prima riga del set attivo.
Recupero delle righe
Dopo che il cursore è stato aperto, la riga corrente viene caricata nelle variabili. La riga corrente è la riga su cui punta il cursore Il recupero dei dati nella variabile PL/SQL o nell'host
La variabile viene eseguita tramite l'istruzione FETCH
Syntax: FETCH INTO ;
- Per ogni valore di colonna restituito dalla query associata al cursore, deve esserci un
variabile corrispondente nell'elenco INTO.
- INOLTRE i loro tipi di dati devono essere compatibili
CHIUDERE UN CURSORE
Chiude esplicitamente il cursore, consentendone la riapertura, se necessario.
Syntax: CLOSE <cursor-name>; Example: CLOSE cur1 Example of Using CLOSE <Cursor Name> DECLARE v_address emp.address%TYPE; CURSOR cur1 is select address from emp; BEGIN OPEN cur1; LOOP FETCH cur1 into v_address; EXIT WHEN cur1%NOTFOUND; DBMS_OUTPUT.PUT_LINE(v_address); END LOOP; CLOSE cur1; END; /
Attributi espliciti del cursore
Attributo | Digita | Descrizione |
%ISOPEN | Booleano | Valuta TRUE se il cursore è aperto |
%NOTFOUND | Booleano | Valuta su TRUE se il recupero più recente non restituisce una riga |
%TROVATO | Booleano | Valuta su TRUE se il recupero più recente restituisce una riga |
%ROWCOUNT | NUMERO | Valuta il numero totale di righe restituite finora |
Concetto avanzato con il cursore Oracle
Cursore e record Oracle
1) Abbiamo già letto dei record PLSQL.
2) Possiamo elaborare le righe del set attivo anche recuperando i valori in un record PL/SQL
3) Possiamo anche definire un record plsql in base all'elenco selezionato delle colonne anche nei cursori espliciti
Esempio
DECLARE CURSOR dept_cursor is Select deptno,dept_name FROM dept; dept_record dept_cursor%rowtype; BEGIN OPEN dept_cursor; LOOP FETCH dept_cursor INTO dept_record; Insert into dept_temp (deptno, deptname) values (dept_record.deptno, dept_record.dept_name); EXIT WHEN dept_cursor%notfound; END LOOP; Commit; CLOSE dept_cursor; END; /
Cursore con parametri/cursore parametrizzato in Oracle
Syntax: CURSOR cursor_name(parameter_name datatype, ) IS Select_statement;
1) Passa i valori dei parametri a un cursore quando il cursore viene aperto e la query viene eseguita
2) Aprire un cursore esplicito più volte con diversi insiemi attivi ogni volta
Open cursor_name(parameter_value , ……);
Esempio
DECLARE CURSOR cur1(v_deptno number) is Select deptname,dept_loc,dept_pincode from dept where deptno=v_deptno; Dept_record cur1%rowtype; l_deptno number:=111; BEGIN OPEN cur1(112); LOOP FETCH cur1 into dept_record; IF cur1%FOUND THEN Dbms_output.put_line(dept_record.deptname); ELSE Exit; END IF; END LOOP; CLOSE cur1; OPEN cur1(l_deptno); LOOP FETCH cur1 into dept_record; IF cur1%FOUND THEN Dbms_output.put_line(dept_record.deptname); ELSE Exit; END IF; END LOOP; CLOSE cur1; END; /
Articoli correlati
Come utilizzare la data in Oracle sql
Tabelle Oracle PLSQL
Tutto sui record Oracle PLSQL
25 domande più frequenti per interviste Oracle plsql
Struttura a blocchi Oracle PLSQL e variabile Oracle PLSQL
Attributi del cursore