ORACLE foloseşte arii de lucru private SQL, arii care execută declaraţii SQL şi care memorează informaţii de procesare. Cursorul este o construcţie PL/SQL, care iţi permite să denumeşti aceste arii de lucru şi care accesează informaţia.
Există două tipuri de cursor:
- Cursor implicit - este declarat de PL/SQL implicit pentru toate comenzile de manipulare a datelor (INSERT, UPDATE, DELETE);
- dacă o instrucţiune LMD nu afectează nici o linie a tabelei nu se generează eroare, însă excepţia trebuie tratată folosind atributele speciale ale cursorilor;
- Cursor explicit - se foloseşte pentru a procesa individual fiecare linie (înregistrare) returnată de o instrucţiune SELECT ce returnează mai multe înregistrări.
- mulţimea înregistrărilor returnate de o instructiune SELECT este numită mulţime rezultat.
- cursorul păstrează un pointer către linia curentă în cadrul unei mulţimi rezultat.
Atribute ale cursorului implicit:
SQL%ROWCOUNT
SQL%FOUND
SQL%NOTFOUND
Exemplu: Folosirea atributului SQL%FOUND
CREATE TABLE dept_temp AS SELECT * FROM departments;
DECLARE
dept_no NUMBER(4) := 270;
BEGIN
DELETE FROM dept_temp WHERE department_id = dept_no;
IF SQL%FOUND THEN --daca stergerea s-a efectuat cu succes
INSERT INTO dept_temp VALUES (270, 'Personnel', 200, 1700);
END IF;
END;
%NOTFOUND
%NOTFOUND este atributul opus lui %FOUND. %NOTFOUND este TRUE daca INSERT, UPDATE sau DELETE nu afecteaza nici o inregistrare din baza de date sau SELECT INTO nu returneaza nici o inregistrare.Altfel este FALSE.
- %ROWCOUNT
%ROWCOUNT returneaza numarul de inregistrari afectate de una din comenzile INSERT, UPDATE, sau DELETE sau numarul de inregistrari afectate de SELECT INTO. %ROWCOUNT este 0 daca comanda INSERT, UPDATE, sau DELETE nu afecteaza nici o inregistrae, sau SELECT INTO nu returneaza nici o inregistrare.
Exemplu: Folosirea SQL%ROWCOUNT
DECLARE
mgr_no NUMBER(6) := 122;
BEGIN
DELETE FROM angajati WHERE manager_id = mgr_no;
DBMS_OUTPUT.PUT_LINE( ‘nr de angajati stersi este: ’ || TO_CHAR(SQL%ROWCOUNT));
END;
Valoarea atributului SQL%ROWCOUNT se refera la cea mai recenta comanda SQL executata in PL/SQL.
Controlul explicit al cursorului – pe paşi
Cursorul explicit poate fi controlat prin 4 tipuri separate de acţiuni:
DECLARE
Numeşte cursorul, şi defineşte structura interogării care să fie efectuate cu el. La acest nivel, interogarea este parcursă (coloane, tabele, etc) dar nu este executată.
Instrucţiunea CURSOR
Este folosită pentru a declara un cursor explicit. Parametrii pot fi definiţi pentru a permite substituţia valorilor în interogare când cursorul este OPEN. Variabilele pot fi deasemeni referite în interogare, dar trebuie să fie declarate înaintea instrucţiunii CURSOR.
Sintaxa:
CURSOR identificator [(parameter details)] IS query-expression;
unde query-expression este o instrucţiune SELECT care poate include majoritatea clauzelor, dar nu o clauză INTO. Nu trebuie definit NULL ca un obiect SELECT.
Exemplu :
DECLARE
CURSOR c1 IS
SELECT nume, salariul, data_angajare FROM angajati
WHERE id_angajat=200;
OPEN
Execută interogarea, legând orice variabilă care a fost referenţiată. Liniile întoarse de interogare, numită "set-activ" sunt acum disponibile pentru extragere.
Este utilizată în cadrul acţiunilor executabile dintr-un bloc, şi stabileşte un set activ de rânduri.
Sintaxa:
OPEN cursor-identif [(lista argumente)] ;
Exemplu:
OPEN c1;
Cursorul va pointa către primul rând în setul activ, ca de exemplu:
> SCOTT 3000 16-jan-90
FORD 3000 03-dec-81
De observat că excepţiile nu sunt lansate dacă cererea nu întoarce niciun rând când este deschis cursorul. Starea cursorului poate, totuşi, să fie testată după un FETCH.
FETCH
Memorează valorile din linia curentă în variabile. Linia curentă este linia la care cursorul pointează. Fiecare FETCH produce mutarea cursorului să indice la linia următoare în setul activ, şi deci fiecare FETCH va accesa o linie diferită returnată de interogare.
Academia de Studii Economice
Facultatea de Cibernetică, Statistică şi Informatică Economică
Pentru a descărca acest document,
trebuie să te autentifici in contul tău.