Sunteți pe pagina 1din 17

Sisteme de Gestiune a Bazelor de Date

5-1

CUPRINS
5. PL/SQL Gestiunea cursoarelor ............................................................................................ 2
5.1. Cursoare implicite........................................................................................................... 4
5.2. Cursoare explicite ........................................................................................................... 4
5.2.1. Gestiunea cursoarelor explicite ................................................................................ 5
5.2.2. Cursoare parametrizate .......................................................................................... 10
5.2.3. Cursoare SELECT FOR UPDATE ......................................................................... 11
5.2.4. Cursoare dinamice ................................................................................................. 14
Bibliografie ........................................................................................................................... 17

Copyright 2012-2014 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.

Sisteme de Gestiune a Bazelor de Date

5-2

5. PL/SQL Gestiunea cursoarelor

Un cursor este un pointer ctre o zon de memorie (Private SQL Area) care
stocheaz informaii despre procesarea unei comenzi SELECT sau LMD.
n acest capitol se discut cursoarele la nivel sesiune.

Cursoarele la nivel de sesiune:


o

sunt diferite fa de cursoarele ce folosesc zon privat SQL din PGA


(Program Global Area);

exist n memoria alocat sesiunii pn la momentul ncheierii acesteia;

Vizualizarea V$OPEN_CURSOR ofer informaii despre cursoarele deschise la


nivel de sesiune ale fiecrei sesiuni utilizator.
n continuare, din motive de simplificare a exprimrii, pentru un cursor la nivel de
sesiune se va utiliza termenul de cursor.

Cursoare implicite
Cursoare
Cursoare explicite

Fig. 5.1. Tipuri de cursoare

Categorii de cursoare:
o

cursoare implicite

cursoare explicite

construite i gestionate automat de PL/SQL


construite i gestionate de ctre utilizatori.

Atributele care furnizeaz informaii despre cursoare:


o

pot fi referite doar de comenzi procedurale

pot fi referite utiliznd sintaxa

pentru cursoarele implicite


SQL%nume_atribut

pentru cursoarele explicite


nume_cursor%nume_atribut

Copyright 2012-2014 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.

Sisteme de Gestiune a Bazelor de Date

5-3

lista atributelor:

%ROWCOUNT
-

este de tip ntreg (PLS_INTEGER);

are valoarea NULL dac nu a fost rulat nicio comand SELECT sau
LMD;

reprezint numrul liniilor ntoarse de ultima comand SELECT sau


numrul de linii afectate de ultima comand LMD;

dac numrul de linii este mai mare dect valoarea maxim permis
de tipul PLS_INTEGER (2.147.483.647), atunci ntoarce o valoare
negativ.

%FOUND
-

este de tip boolean;

are valoarea NULL dac nu a fost rulat nicio comand SELECT sau
LMD;

n cazul cursoarelor implicite are valoarea TRUE dac ultima comand


SELECT a ntors cel puin o linie sau ultima comand LMD a afectat
cel puin o linie;

n cazul cursoarelor explicite are valoarea TRUE dac ultima operaie


de ncrcare (FETCH) dintr-un cursor a avut succes.

%NOTFOUND
-

este de tip boolean;

are semnificaie opus fa de cea a atributului %FOUND.

%ISOPEN
-

este de tip boolean;

indic dac un cursor este deschis;

n cazul cursoarelor implicite, acest atribut are ntotdeauna valoarea


FALSE, deoarece un cursor implicit este nchis de sistem imediat dup
execuia instruciunii SQL asociate.

%BULK_ROWCOUNT
-

vezi n Capitolul 4 comanda FORALL

%BULK_EXCEPTIONS
-

vezi n Capitolul 4 comanda FORALL

Copyright 2012-2014 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.

Sisteme de Gestiune a Bazelor de Date

5-4

5.1. Cursoare implicite

PL/SQL deschide automat un cursor implicit la nivel de sesiune de fiecare dat


cnd este rulat o comand SELECT sau LMD.

Mai sunt denumite i cursoare SQL.

Cursorul implicit este nchis automat, atunci cnd comanda se ncheie.

Valorile atributelor asociate cursorului rmn disponibile pn cnd este rulat o


alt comand SELECT sau LMD.

Exemplul 5.1 vezi curs

Atributul SQL%NOTFOUND nu este util n cazul comenzii SELECT INTO.

Dac aceast comand nu ntoarce linii, atunci apare imediat excepia


NO_DATA_ FOUND (nainte s se poat verifica valoarea atributului
SQL%NOTFOUND ).

Dac n lista SELECT a comenzii se utilizeaz funcii agregat, atunci este


ntoars ntotdeauna o valoare. n acest

caz, valoarea atributului

SQL%NOTFOUND este FALSE.


Dac o comand SELECT INTO (nu este folosit clauza BULK COLLECT)
ntoarce mai multe linii, atunci apare imediat excepia TOO_MANY_ROWS.
n acest caz, atributul SQL%ROWCOUNT are valoarea 1 (nu numrul de linii care
satisfac cererea).

5.2. Cursoare explicite

Sunt cursoare la nivel de sesiune definite i gestionate de ctre utilizatori.

Un cursor explicit are specificat un nume. Acesta este asociat cu o comand


SELECT ce ntoarce de obicei mai multe linii.

Mulimea rezultat a cererii asociate poate fi procesat folosind una dintre


variantele urmtoare:
o

se deschide cursorul (comanda OPEN), se ncarc liniile cursorului n variabile


(comanda FETCH), se nchide cursorul (comanda CLOSE);

se utilizeaz cursorul ntr-o comand FOR LOOP.

Copyright 2012-2014 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.

Sisteme de Gestiune a Bazelor de Date

5-5

5.2.1. Gestiunea cursoarelor explicite


DECLARE
declarare cursor
BEGIN
deschidere cursor (OPEN)
WHILE rmn linii de recuperat LOOP
recuperare linie rezultat (FETCH)
END LOOP
nchidere cursor (CLOSE)
END;

Declararea unui cursor explicit

Sintaxa de declarare, fr a asocia comanda SELECT

CURSOR nume_cursor [RETURN tip];

Sintaxa de declarare, cu asociere a comanda SELECT

CURSOR nume_cursor [RETURN tip]


IS comanda_SELECT;
Exemplul 5.2
DECLARE
CURSOR c1 RETURN produse%ROWTYPE;
CURSOR c2 IS
SELECT id_produs, denumire FROM produse;
CURSOR c1 RETURN produse%ROWTYPE IS
SELECT * FROM PRODUSE;
BEGIN
NULL;
END;

Numele cursorului este un identificator unic n cadrul blocului, care nu poate s


apar ntr-o expresie i cruia nu i se poate atribui o valoare.
Comanda SELECT care apare n declararea cursorului, nu trebuie s includ
clauza INTO.
Dac se cere procesarea liniilor ntr-o anumit ordine, atunci n cerere este
utilizat clauza ORDER BY.

Copyright 2012-2014 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.

Sisteme de Gestiune a Bazelor de Date

5-6

Variabilele care sunt referite n comanda SELECT trebuie declarate naintea


comenzii CURSOR. Acestea sunt considerate variabile de legtur.
Dac n lista SELECT apare o expresie, atunci pentru expresia respectiv
trebuie utilizat un alias, iar cmpul expresie se va referi prin acest alias.
Deschiderea unui cursor explicit

Sintaxa
OPEN nume_cursor;

Comanda OPEN execut cererea asociat cursorului, identific mulimea liniilor


rezultat (mulimea activ) i poziioneaz cursorul naintea primei linii.

Dac se ncearc deschiderea unui cursor deja deschis, atunci pare excepia
CURSOR_ALREADY_OPEN.

La deschiderea unui cursor se realizeaz urmtoarele operaii:


o

se aloc resursele necesare pentru a procesa cererea

se proceseaz cererea
se evalueaz comanda SELECT asociat (sunt examinate valorile
variabilelor de legtur ce apar n declaraia cursorului)
se identific mulimea activ prin execuia cererii SELECT, avnd n vedere
valorile de la pasul anterior;
dac cererea include clauza FOR UPDATE, atunci liniile din mulimea
activ sunt blocate;

se poziioneaz pointer-ul naintea primei linii din mulimea activ.

Exemplul 5.3
DECLARE
CURSOR c1 IS
SELECT * FROM categorii WHERE id_parinte IS NULL;
CURSOR c2 IS
SELECT * FROM categorii WHERE 1=2;
BEGIN
OPEN c1;
IF c1%FOUND THEN
DBMS_OUTPUT.PUT_LINE('c1 - cel putin o linie');
ELSE
DBMS_OUTPUT.PUT_LINE('c1 - nicio linie');
END IF;

Copyright 2012-2014 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.

Sisteme de Gestiune a Bazelor de Date

5-7

OPEN c2;
IF c2%NOTFOUND THEN
DBMS_OUTPUT.PUT_LINE('c2 - nicio linie');
ELSE
DBMS_OUTPUT.PUT_LINE('c2 - cel putin o linie');
END IF;
CLOSE c1;
CLOSE c2;
END;

ncrcarea datelor dintr-un cursor explicit

Comanda FETCH regsete liniile rezultatului din mulimea activ.

Sintaxa
FETCH nume_cursor INTO {nume_variabil
[, nume_variabil] | nume_nregistrare};
FETCH nume_cursor BULK COLLECT INTO
{nume_variabil_colecie
[,nume_variabil_colecie]

FETCH realizeaz urmtoarele operaii:


o

avanseaz pointer-ul la urmtoarea linie n mulimea activ (pointer-ul poate


avea doar un sens de deplasare de la prima nregistrare spre ultima);

citete datele liniei curente n variabile PL/SQL;

dac pointer-ul este poziionat la sfritul mulimii active, atunci se iese din
bucla cursorului.

Comanda FETCH INTO regsete la un moment dat o singur linie.


Comanda FETCH BULK COLLECT INTO ncarc la un moment mai multe linii
n colecii.
Exemplul 5.4 vezi curs
Exemplul 5.5 vezi curs

Copyright 2012-2014 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.

Sisteme de Gestiune a Bazelor de Date

5-8

Atunci cnd un cursor ncarc o linie, acesta realizeaz o schimbare de


context controlul este preluat de motorul SQL care va obine datele. Motorul
SQL plaseaz datele n memorie i are loc o alt schimbare de context
controlul este preluat napoi de motorul PL/SQL. Procesul se repet pn cnd
nu mai sunt date de ncrcat. Schimbrile de context sunt foarte rapide, dar
numrul prea mare de astfel de operaii poate implica performan sczut.
Folosind metoda BULK COLLECT sunt obinute mai multe linii, implicnd
doar 2 schimbri de context.
ncepnd cu Oracle 10g, un cursor poate determina ca PL/SQL s realizeze
implicit operaii BULK COLLECT, ncrcnd cte 100 linii la un moment dat,
fr a mai fi necesar utilizarea coleciilor. n acest caz, utilizarea coleciilor se
poate dovedi util, doar dac sunt ncrcate mai multe sute de linii.
Exemplul 5.6 vezi curs
Exemplul 5.7 vezi curs
nchiderea unui cursor explicit

Dup ce a fost procesat mulimea activ, cursorul trebuie nchis.


o

PL/SQL este informat c programul a terminat folosirea cursorului i resursele


asociate acestuia pot fi eliberate:
spaiul utilizat pentru memorarea mulimii active;
spaiul temporar folosit pentru determinarea mulimii active.

Sintaxa:
CLOSE nume_cursor;

Pentru a reutiliza cursorul este suficient ca acesta s fie redeschis.

Dac se ncearc ncrcarea datelor dintr-un cursor nchis, atunci apare excepia
INVALID_CURSOR.
Dac un bloc PL/SQL s termin fr a nchide un cursor utilizat, sistemul
nu va returna o eroare sau un mesaj de avertizare.
Se recomand nchiderea cursoarelor pentru a permite sistemului s
elibereze resursele alocate.

Copyright 2012-2014 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.

Sisteme de Gestiune a Bazelor de Date

5-9

Valorile atributelor unui cursor explicit sunt prezentate n urmtorul tabel:


Primul
FETCH

OPEN

Urmtorul
FETCH

Ultimul
FETCH

CLOSE

nainte Dup nainte Dup nainte Dup nainte Dup nainte

Dup

%ISOPEN

False

True

True

True

True

True

True

True

True

False

%FOUND

Eroare

Null

Null

True

True

True

True

Flase

False

Eroare

%NOTFOUND

Eroare

Null

Null

False

False

False

False

True

True

Eroare

%ROWCOUNT

Eroare

Depinde de date

Eroare

Dup prima ncrcare, dac mulimea rezultat este vid, %FOUND va fi FALSE,
%NOTFOUND va fi TRUE, iar %ROWCOUNT este 0.

Procesarea liniilor unui cursor explicit

Se utilizeaz o comand de ciclare (LOOP, WHILE sau FOR), prin care la fiecare
iteraie se va ncrca o linie nou.

Pentru ieirea din ciclu poate fi utilizat comanda EXIT.

Utilizarea comenzii de ciclare LOOP


vezi exemplul 5.4

Utilizarea comenzii de ciclare WHILE


vezi exemplul 5.5

Dac se utilizeaz una dintre comenzile de ciclare LOOP sau WHILE, atunci
cursorul trebuie:
1. declarat
2. deschis
3. parcurs, ncrcnd cte o linie la fiecare iteraie (trebuie s se asigure ieirea
din bucl atunci cnd nu mai sunt linii de procesat)
4. nchis

Utilizarea comenzii de ciclare FOR


o

Procesarea liniilor unui cursor explicit se poate realiza i cu ajutorul unui


ciclu FOR special, numit ciclu cursor.

n acest caz cursorul trebuie doar declarat, operaiile de deschidere,


ncrcare i nchidere ale acestuia fiind implicite.

Copyright 2012-2014 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.

Sisteme de Gestiune a Bazelor de Date

5-10

Sintaxa:
FOR nume_nregistrare IN nume_cursor LOOP
secven_de_instruciuni;
END LOOP;

Variabila nume_nregistrare nu trebuie declarat.

Exemplul 5.8 vezi curs


o

Exist ciclu cursoare speciale care n comanda FOR n loc s refere un cursor
declarat, utilizeaz direct o subcerere (ciclu cursor cu subcereri).

n acest caz nu este necesar nici mcar declararea cursorului.

Exemplul 5.9 vezi curs

5.2.2. Cursoare parametrizate

Unei variabile de tip cursor i corespunde o comand SELECT, care nu poate fi


modificat pe parcursul programului.

Cursoarele parametrizate sunt cursoare ale cror comenzi SELECT depind de


parametri ce pot fi modificai la momentul execuiei.
o

Transmiterea de parametri unui cursor parametrizat se face n mod similar


procedurilor stocate.

Declararea unui cursor parametrizat

Sintaxa de declarare, fr a asocia comanda SELECT

CURSOR nume_cursor (declarare_parametru


[,declarare_parametru ])
[RETURN tip];

Sintaxa de declarare, cu asocierea comenzii SELECT

CURSOR nume_cursor (declarare_parametru


[,declarare_parametru ])
[RETURN tip]
IS comanda_SELECT;

declarare_parametru are sintaxa:

nume_parametru [IN] tip_date_scalar


[ {:= | DEFAULT} expresie]
o

Parametrul unui cursor nu poate fi declarat NOT NULL.

Copyright 2012-2014 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.

Sisteme de Gestiune a Bazelor de Date

5-11

Deschiderea unui cursor parametrizat

Se realizeaz asemntor apelului unei funcii, specificnd lista parametrilor


actuali ai cursorului.
o

Asocierea dintre parametrii formali i cei actuali se face prin:

poziie (parametrii actuali sunt separai prin virgul, respectnd ordinea


parametrilor formali);

nume (parametrii actuali sunt aranjai ntr-o ordine arbitrar, dar cu o


coresponden de forma parametru formal => parametru actual).

Dac n definiia cursorului, toi parametrii au valori implicite (DEFAULT),


cursorul poate fi deschis fr a specifica vreun parametru.

n determinarea mulimii active se vor folosi valorile actuale ale parametrilor.

Sintaxa
OPEN nume_cursor
[ (valoare_parametru [, valoare_parametru] ) ];

Procesarea liniilor unui cursor parametrizat

Dac pentru procesare sunt utilizate comenzile de ciclare LOOP sau WHILE,
atunci nu apar modificri de sintax.

Dac este utilizat un ciclu cursor, atunci se va utiliza sintaxa:


FOR nume_nregistrare IN nume_cursor
[(valoare_parametru [, valoare_parametru] )] LOOP
secven_de_instruciuni;
END LOOP;

nchiderea unui cursor parametrizat

Nu apar modificri de sintax.

Exemplul 5.10 vezi curs

5.2.3. Cursoare SELECT FOR UPDATE

Dac este necesar blocarea liniilor nainte ca acestea s fie terse sau
reactualizate, atunci blocarea se poate realiza cu ajutorul clauzei FOR UPDATE a
comenzii SELECT din definiia cursorului.
o

Cursorul trebuie s fie deschis.

Copyright 2012-2014 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.

Sisteme de Gestiune a Bazelor de Date

5-12

Sintaxa
CURSOR nume_cursor IS
comanda_select
FOR UPDATE [OF list_coloane]
[NOWAIT | WAIT n | SKIP LOCKED];
o

Identificatorul list_coloane este o list ce include cmpurile tabelului care vor


fi modificate.
Coloanele incluse n aceast list indic doar liniile crui tabel vor fi
blocate.
Dac lista de coloane lipsete, atunci vor fi blocate liniile selectate din toate
tabelele referite n cerere.

Implicit comanda ateapt pn cnd linia necesar devine disponibil i apoi


ntoarce rezultatul cererii.

Pentru a modifica acest comportament se poate utiliza una dintre opiunile:


NOWAIT nu ateapt deblocarea liniei i ntoarce o eroare dac liniile sunt
deja blocate de alt sesiune;
WAIT n ateapt n secunde (n este de tip ntreg) pentru deblocarea liniei,
iar dac linia nu este deblocat n acest interval, ntoarce un mesaj de eroare.
SKIP LOCKED se va ncerca blocarea liniilor selectate de cerere, iar
liniile care sunt deja blocate de o alt tranzacie vor fi srite (opiune
utilizat de exemplu n Oracle Streams Advanced Queuing).
Exemplul 5.11 vezi explicatii curs

--sesiune 1
SELECT * FROM produse
WHERE id_produs=10 FOR UPDATE;
--commit;
--sesiune 2
SELECT * FROM curs_plsql.produse
WHERE id_produs=10
FOR UPDATE NOWAIT;
SELECT * FROM curs_plsql.produse
WHERE id_produs=1000
FOR UPDATE WAIT 10;

Copyright 2012-2014 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.

Sisteme de Gestiune a Bazelor de Date

5-13

n momentul deschiderii unui cursor FOR UPDATE, liniile din mulimea


activ, determinat de clauza SELECT, sunt blocate pentru operaii de
scriere (reactualizare sau tergere). n felul acesta este realizat consistena
la citire a sistemului.
De exemplu, aceast situaie este util atunci cnd se reactualizeaz o
valoare a unei linii i trebuie avut sigurana c linia nu este schimbat de
un alt utilizator naintea reactualizrii. Astfel, alte sesiuni nu pot schimba
liniile din mulimea activ pn cnd tranzacia nu este permanentizat sau
anulat.

Dac un cursor este declarat folosind clauza FOR UPDATE, atunci comenzile
DELETE/UPDATE corespunztoare trebuie s conin clauza WHERE CURRENT
OF nume_cursor.
o

Clauza refer linia curent care a fost gsit de cursor, permind ca


reactualizrile i tergerile s se efectueze asupra acestei linii, fr referirea
explicit a cheii primare sau pseudocoloanei ROWID.
Deoarece cursorul lucreaz doar cu nite copii ale liniilor existente n
tabele, dup nchiderea cursorului este necesar comanda COMMIT pentru
a realiza scrierea efectiv a modificrilor.
Deoarece blocrile implicate de clauza FOR UPDATE vor fi eliberate de
comanda COMMIT, nu este recomandat utilizarea comenzii COMMIT n
interiorul ciclului n care se fac ncrcri de date. Orice FETCH executat
dup COMMIT va eua.
n cazul n care cursorul nu este definit folosind SELECTFOR UPDATE,
nu apar probleme n acest sens i, prin urmare, n interiorul ciclului unde se
fac schimbri ale datelor poate fi utilizat comanda COMMIT.

Exemplul 5.12 vezi curs


Exemplul 5.13 vezi curs

Copyright 2012-2014 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.

Sisteme de Gestiune a Bazelor de Date

5-14

5.2.4. Cursoare dinamice

Un cursor static este un cursor a crui comand SQL este cunoscut la momentul
compilrii blocului.
o

Toate exemplele anterioare se refer la cursoare statice.

n PL/SQL a fost introdus conceptul de variabil cursor, care este de tip referin.

Variabilele cursor
o

sunt similare tipului pointer din limbajele C sau Pascal

un cursor este un obiect static, iar un cursor dinamic este un pointer la un


cursor

sunt dinamice deoarece li se pot asocia diferite cereri (coloanele obinute de


fiecare cerere trebuie s corespund declaraiei variabilei cursor)

trebuie declarate, deschise, ncrcate i nchise n mod similar unui cursor


static

la momentul declarrii nu solicit o cerere asociat

pot primi valori

pot fi utilizate n expresii

pot fi utilizate ca parametrii n subprograme

pot fi utilizate pentru a transmite mulimea rezultat a unei cereri ntre


subprograme

pot fi variabile de legtur

pot fi utilizate pentru a transmite mulimea rezultat a unei cereri ntre


subprograme stocate i diferii clieni

nu accept parametrii

Sintaxa de declarare
TYPE

tip_ref_cursor IS REF CURSOR [RETURN tip_returnat];

var_cursor

tip_ref_cursor;

var_cursor este numele variabilei cursor

tip_ref_cursor este un nou tip de dat ce poate fi utilizat n declaraiile


urmtoare ale variabilelor cursor

tip_returnat este un tip nregistrare sau tipul unei linii dintr-un tabel

corespunde coloanelor ntoarse de ctre orice cursor asociat variabilelor


cursor de tipul definit

Copyright 2012-2014 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.

Sisteme de Gestiune a Bazelor de Date

5-15

dac lipsete clauza RETURN, cursorul poate fi deschis pentru orice cerere

Restricii de utilizare a variabilelor cursor


variabilele cursor nu pot fi declarate n specificaia unui pachet

un pachet nu poate avea definit o variabil cursor ce poate fi referit din


afara pachetului

valoarea unei variabile cursor nu poate fi stocat ntr-o colecie sau o coloan a

unui tabel
nu pot fi utilizai operatorii de comparare pentru a testa egalitatea, inegalitatea

sau valoarea null a variabilelor cursor


o

nu pot fi folosite cu SQL dinamic n Pro*C/C++

Utilizarea unei variabile cursor

Comanda OPENFOR asociaz o variabil cursor cu o cerere, execut cererea,


identific mulimea rezultat i poziioneaz cursorul naintea primei linii din mulimea
rezultat.

Sintaxa
OPEN {variabila_cursor | :variabila_cursor_host}
FOR {cerere_select |
ir_dinamic [USING argument_bind [, argument_bind ]]};
o

variabila_cursor specific o variabil cursor declarat anterior

cerere_select reprezint cererea pentru care este deschis variabila cursor

ir_dinamic este o secven de caractere care reprezint cererea

este specific prelucrrii dinamice a comenzilor, iar posibilitile oferite de


SQL dinamic vor fi analizate ntr-un capitol separat

:variabila_cursor_host reprezint o variabil cursor declarat ntr-un mediu


gazd PL/SQL

Comanda OPEN .. FOR poate deschide acelai cursor pentru diferite cereri. Nu este
necesar nchiderea variabilei cursor nainte de a o redeschide. Dac se redeschide
variabila cursor pentru o nou cerere, cererea anterioar este pierdut.
Exemplul 5.14 vezi curs
Exemplul 5.15 vezi curs

Copyright 2012-2014 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.

Sisteme de Gestiune a Bazelor de Date

5-16

Expresii cursor

n versiunea Oracle9i a fost introdus conceptul de expresie cursor, care ntoarce un


cursor imbricat (nested cursor).

Sintaxa:
CURSOR (subcerere)

Semnificaie
o

Fiecare linie din mulimea rezultat poate conine valori uzuale i cursoare generate
de subcereri.

Utilizare
o

PL/SQL accept cereri care au expresii cursor n cadrul unei declaraii cursor,
declaraii REF CURSOR i a variabilelor cursor.

Expresia cursor poate s apar ntr-o comand SELECT ce este utilizat pentru
deschiderea unui cursor dinamic.

Expresia cursor poate fi utilizat n cereri SQL dinamice sau ca parametri


actuali ntr-un subprogram.

Restricii de utilizare a unei expresii cursor

nu poate fi utilizat cu un cursor implicit;

poate s apar numai ntr-o comand SELECT care nu este imbricat n alt
cerere (exceptnd cazul n care este o subcerere chiar a expresiei cursor) sau ca
argument pentru funcii tabel, n clauza FROM a lui SELECT;

nu poate s apar n interogarea ce definete o vizualizare;

nu se pot efectua operaii BIND sau EXECUTE cu aceste expresii.

ncrcarea cursorului imbricat se realizeaz


o

automat atunci cnd liniile care l conin sunt ncrcate din cursorul printe.

nchiderea cursorului imbricat are loc


o

dac este realizat explicit de ctre utilizator;

atunci cnd cursorul printe este reexecutat sau nchis;

dac apare o eroare n timpul unei ncrcri din cursorul printe.

Exemplul 5.16 vezi curs

Copyright 2012-2014 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.

Sisteme de Gestiune a Bazelor de Date

5-17

Bibliografie
1. Programare avansat n Oracle9i, I. Popescu, A. Alecu, L. Velcescu, G. Florea
(Mihai), Ed. Tehnic (2004)
2. Oracle Database PL/SQL Language Reference 11g Release 2, Oracle Online
Documentation (2012)
3. Oracle

Database

SQL

Language

Reference11g Release

2,

Oracle

Online

Documentation (2012)
4. Oracle Database 11g: PL/SQL Fundamentals, Student Guide, Oracle University
(2009)

Copyright 2012-2014 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.