Sunteți pe pagina 1din 6

Obiective:

La sfârsitul acestui laborator ar trebui sa puteti realiza


urmatoarele:
 Scrierea unui cursor care foloseste parametri.
 Când se foloseste clauza FOR UPDATE într-un
cursor.
 Când se foloseste clauza WHERE CURENT OF
într-un cursor.
 Scrierea unui cursor care foloseste interogare

Lectia Aim

În aceasta lectie veti învata sa scrieti cursori expliciti, în special cei care folosesc
parametri si tabele de înregistrari PL/SQL.

Cursori cu parametri

Sintaxa :
CURSOR cursor_name
[(parameter_name datatype, …)]
IS
Select_statement;

 Da valori parametrilor unui cursor atunci când


cursorul este deschis si interogarea este realizata.
 Deschide un cursor explicit de câteva ori, cu un set
activ diferit de fiecare data.

Cursori cu parametri
Parametri permit valorilor sa fie transmise unui cursor atunci când este deschis si sa
fie folosite într-o interogare atunci când se executa. Aceasta înseamna ca puteti
deschide si închide de câteva ori un cursor explicit într-un bloc, returnând de fiecare
data un set activ diferit.
Fiecare parametru formal declarat în cursor trebuie sa aiba un parametru actual
corespondent în OPEN. Tipurile de date ale parametrilor sunt la fel ca cele pentru

1
variabile scalare, dar nu le veti da aceleasi dimensiuni. Numele parametrilor sunt
pentru referirile din expresia interogarii cursorului.
În sintaxa,

Cursor name este un identificator PL/SQL pentru cursorul declarat anterior.


Parameter name este numele parametrului. Parametrul este folosit în urmatoarea
sintaxa.
Cursor_parameter_name [IN] datatype [{:=DEFAULT} exprt]

datatype este un tip scalar al parametrului


select statement este un SELECT fara clauza INTO.
Atunci când cursorul este deschis, dati valori fiecarui parametru în ordinea
pozitionarii. Puteti da valori din variabilele din PL/SQL la fel de bine ca si explicit.
Nota: notarea parametrului nu ofer[ o mare functionalitate: îti permite doar sa
specifici valorile introduse simplu si clar. Aceasta este folositoare atunci când acelasi
cursor este referit în mod repetat.

Cursori cu parametri

Dati numarul departamentului si numele meseriei în clauza


WHERE.

Exemplu

DECLARE
CURSOR c1
(v_depno NUMBER, v_job VARCHAR2) IS
SELECT empno, ename
FROM emp
WHERE deptno = v_deptno
AND job = v_job;
BEGIN
OPEN c1 (10, ‘CLERK’);

Tipurile parametrilor sunt la fel cu cele pentru variabile scalare, dar nu le dati
dimensiunea. Numele parametrilor sunt pentru referiri în interogarea cursorului.
În exemplul urmator, sunt declarate doua variabile si un cursor. Cursorul este definit
cu doi parametri.

DECLARE
Job_emp emp.job%TYPE := ‘CLERK’;
V_ename emp.ename%TYPE;
CURSOR c1 (v_deptno NUMBER, v_job VARCHAR2) IS
SELECT…

2
Urmatoarele propozitii deschid cursorul:

OPEN c1 (10, job_emp);


OPEN c1 (20, ‘ANALYST’);

Puteti transmite parametri unui cursor folosit într-o bucla FOR.

DECLARE
CURSOR c1 (v_depno NUMBER, v_job VARCHAR2) IS
SELECT…
BEGIN
FOR emp record IN c1 (20, ‘ANALYST’) LOOP…

Clauza FOR UPDATE

Sintaxa:

SELECT…
FROM
FOR UPDATE [OF column_reference] [NOWAIT]

 Blocarea explicita îti permite sa interzici accesul pe durata


tranzactiei.
 Blocheaza liniile înainte de modificare sau stergere.

Clauza FOR UPDATE

Puteti bloca liniile înainte de modificare sau stergere. Adaugati clauza FOR UPDATE
în interogarea cursorului pentru a bloca liniile aferente atunci când cursorul este
deschis. Deoarece Server-ul Oracle realizeaza blocarile la sfârsitul tranzactiei, ar
trebui sa nu comiteti asupra fetch-urilor dintr-un cursor explicit daca este folosita
FOR UPDATE.

În sintaxa:

Column referenceeste o coloana în tabela împotriva careia lucreaza interogarea.


Poate fi folosita si o lista de coloane.
NOWAIT returneaza o eroare Oracle daca liniile sunt blocate de o alta
sesiune.
Clauza FOR UPDATE este ultima dint-un SELECT, chiar dupa ORDER BY, daca
exista unul.

3
Cand interogam mai multe tabele, puteti folosi clauza FOR UPDATE pentru a va
limita la liniile blocate ale unor anumite tabele. Liniile într-o tabela sunt blocate
numai daca clauza FOR UPDATE se refera la o coloana din acea tabela.
Liniile blocate exclusiv sunt luate în liniile rezultatului înainte de returnarea lui OPEN
când este folosita clauza FOR UPDATE.

Clauza FOR UPDATE

Retrageti comenzile de peste 1000$ care au fost date astazi.

Exemplu

DECLARE
CURSOR c1 IS
SELECT empno, ename
FROM emp
FOR UPDATE NOWAIT;

Clauza FOR UPDATE


Nota: daca Server-ul Oracle nu poate bloca liniile necesare în SELECT FOR
UPDATE, el asteapta un timp nedefinit. Puteti folosi clauza NOWAIT în SELECT
FOR UPDATE si sa testati erorile de cod care returneaza esecul blocarii într-o bucla.
Astfel, puteti retrage deschiderea cursorului de n ori înainte de terminarea blocului
PL/SQL. Daca aveti o tabela mai mare puteti obtine rezultate mai bune folosind
LOCK TABLE pentru a bloca toate liniile din tabela. Oricum, folosind LOCK
TABLE nu mai puteti folosi WHERE CURRENT OF si trebuie sa folositi notatia
column=identifier.
Nu este obligatoriu ca FOR UPDATE sa se refere la o coloana, oricum este
recomandat sa se realizeze acest lucru pentru o buna functionare.

Clauza WHERE CURRENT OF

Sintaxa:
WHERE CURRENT OF cursor
 Foloseste cursorii pentru modificarea si stergerea liniei
curente.
 Include clauza FOR UPDATE în interogarea cursorului
pentru a bloca întâi liniile.
 Foloseste clauza WHERE CURRENT OF pentru a se
referi la linia curenta dintr-un cursor explicit.

4
Clauza WHERE CURRENT OF
Când va referiti la linia curenta dintr-un cursor explicit, folositi clauza WHERE
CURRENT OF. Aceasta va permite sa modificati si sa stergeti linia curenta, fara a
folosi explicit ROWID. Trebuie sa includeti clauza FOR UPDATE în interogarea
cursorului pentru ca liniile sa fie blocate pentru OPEN.

În sintaxa,
Cursor este numele cursorului declarat. Cursorul trebuie sa fi fost declarat
folosind clauza FOR UPDATE.

Clauza WHERE CURRENT OF

Exemplu

DECLARE
CURSOR c1 IS
SELECT…
FOR UPDATE NOWAIT;
BEGIN

FOR emp_record IN c1 LOOP
UPDATE…
WHERE CURRENT OF C1;

END LOOP;
COMMIT;
END;

Clauza WHERE CURRENT OF


Puteti modifica liniile dintr-un cursor, pe baza unui criteriu.
Aditional, puteti folosi DELETE sau UPDATE pentru a contine clauza WHERE
CURRENT OF cursor name , pentru a ne referi la ultimele linii procesate de FETCH.
Atunci când folositi aceasta clauza, cursorul la care va referiti trebuie sa existe si
trebuie sa contina clauza FOR UPDATE, altfel veti obtine o eroare. Aceasta clauza va
permite sa modificati si sa stergeti linia curenta fara a fi nevoie sa folositi ROWID.

CURSORI CU SUBINTEROGARI

Exemplu

DECLARE
CURSOR my_cursor IS
SELECT t1.deptno, dname, STAFF
FROM dept t1, (SELECT deptno, count (*) STAFF
FROM emp
GROUP BY deptno) t2
WHERE t1.deptno=t2.deptno
AND STAFF >= 5;

5
Subînterogari
O subînterogare este o înterogare (de obicei cuprinsa de paranteze) care apare
împreuna cu alte instructiuni SQL.
 Subînterogarile sunt de obicei folosite în clauza WHERE.
 Pot fi folosite subînterogari sau subînterogari corelate.

Cuprins

 Returnare rezultate folosind cursori cu parametri.


 Definirea cursorilor cu subînterogari si subînterogari corelate.
 Manipularea cursorilor expliciti folosind:
- FOR UPDATE
- WHERE CURRENT OF

Aplicatie practica

 Declararea si folosirea cursorilor expliciti cu


parametri.
 Folosirea cursorului cu FOR UPDATE.

Aplicatie practica
Aceasta aplicatie foloseste cunostintele voastre despre cursori cu parametri pentru a
procesa un numar de linii din tabele.

1. Scrieti o interogare pentru a retrage toate departamentele si angajatii din fiecare


departament. Introduceti rezultatele în tabela MESSAGES. Folositi un cursor
pentru a retrage numarul departamentului si dati numarul departamentului unui
cursor pentru a retrage angajatii din acel departament.

2. Modificati p19q5 pentru a folosi FOR UPDATE si WHERE CURRENT OF.

S-ar putea să vă placă și