Sunteți pe pagina 1din 7

Baze de date

- Lucrare de laborator CURSOARE

Obiective
1.
2.
3.
4.
5.

Manipularea cursoarelor
Declararea unui cursor
Folosirea Record Types
Folosirea Cursor Attributes
Prelucrarea unui Cursor Explicit, Implicit, Cursor FOR Loops i Nesting Cursors

1. Introducere
Cursoare sunt zone de memorie care ne permit s alocam o zon de memorie i s
accesam informaia provenit dintr-o instruciune SQL. De exemplu, se foloseste un
cursor pentru a opera cu toate liniile tabelului STUDENT pentru acei studeni care iau
parte la un anumit curs ( au asociate intrri n tabelul inscrisi) (ENROLLMENT). n acest
capitol, vom nva s declaram un cursor explicit care activeaz un utilizator pentru a
prelucra mai multe linii returnate de un query i care permit utilizatorului s scrie codul
care va prelucra fiecare linie linie unul cte unul.
2. Manipularea cursoarelor
Un cursor este un handler, sau pointer, la suprafaa de context. Prin cursor, un
program PL SQL poat s controleze suprafaa de context i ce se ntmpla cu aceasta
atunci cnd instruciunea este prelucrat. Aceast informaie include numrul de linii care
au fost prelucrate de instruciune, un pointer la reprezentarea instruciunii analizate(
analizarea unei instruciuni SQL este procesul prin care informaia este transferat la
server, timp n care instruciunea SQL este evaluat ca valid). ntr-un query, setul activ
se refer la liniile care vor fi returnate. Pentru ca Oracle s proceseze o instruciune SQL,
este nevoie ca el s creeze o zon de memorie cunoscut ca buffer de context; Aceast va
conine informaia necesar prelucrrii instruciunilor.
Ocaracteristica importanta a cursoarelor este ca ne permit s aducem i s
prelucram liniile care sunt returnate de o instruciune SELECT, una cte una.
3. Declararea unui Cursor
Declararea unui cursor definete numele cursorului i l asocieaz cu o
instruciune SELECT. Primul pas este de a declara cursorul folosind urmtoarea sintax:
1

CURSOR c-nume-cursor
IS instructiune SELECT
Conveniile de nume care se ntrebuineaz n Oracle recomand s numim
ntotdeauna un cursor c_numecursor. Folosind litera c_la nceputul numelui ne va fi
ntotdeauna clar c numele se refer la un cursor.
Nu este posibil folosirea unui cursor fr execuia complet a secvenei:
(1) declare,
( 2) deschidere,
( 3) aducere, i n cele din urm
( 4) nchidere.
Pentru a explica aceti patru pai, urmtorul exemplu va avea fragmentele de cod
pentru fiecare pas i n cele din urm ne va arta procesul complet.
Acesta este un fragment PL SQL care demonstreaz pasul nti de declarare al
unui cursor. Un cursor numit C_mycursor este declarat ca o instruciune SELECT a
tuturor liniilor din tabelul zipcode care are articolul state egal cu 'NY'.
De exemplu.
DECLARE
CURSOR C_MyCursor IS
SELECT *
FROM zipcode
WHERE stat = 'RO';
...
<aici va continua codul cu deschiderea, aducerea i nchiderea cursorului>
Numele cursoarelor satisfac aceleai reguli ca cele ale numelor simbolice din PL
SQL. Pentru c numele cursorului este un nume simbolic din PL SQL, el trebuie s fie
declarat nainte ca el s fie referit. Orice instruciune SELECT valid poate s fie
ntrebuinat pentru a defini un cursor, care includ comenzile de reuniune UNION sau
diferenta MINUS.
4. Tipuri de Cursore
Exist dou tipuri de cursoare:
1. Un cursor implicit este n mod automat declarat de Oracle de fiecare dat cnd
o instruciune SQL este executat. Utilizatorul nu va fi contient c acest lucru se
ntmpla i nu va fi n stare s controleze sau s prelucreze informaia dintr-un cursor
implicit.

2. Un cursor explicit este definit de program pentru oricare query care returneaz
mai mult de un linie de informaii. Aceasta nseamn c mediul de programare a declarat
cursorul ntr-un bloc scris n PL/SQL. Aceast declaraie permite ca aplicaia s
proceseze secvenial fiecare linie de informaii aa cum este acum returnat de cursor.
4.1. Cursor Implicit
Pentru o mai bun nelegere a posibilitilor unui cursor explicit, trebuie mai nti
s trecem n revist procesul unui cursor implicit.
Orice bloc de PL SQL este un cursor implicit oricnd se execut o instruciune
SQL, att timp ct un cursor explicit nu este declarat pentru acea instruciune SQL.
Un cursor este n mod automat asociat cu o instruciune DML( Data
Manipulation) (UPDATE, DELETE, INSERT).
Toate instruciunile de ACTUALIZARE i TERGERE au cursoare care identific setul
de linii care vor fi afectate de operaia respectiv.
O instruciune INSERT are nevoie de un loc de pentru a primi informaiile care
urmeaz s s fie inserate n baza de date; Cursorul implicit realizeaz aceast nevoie.
Cursor implicit este intitulat cursorul 'SQL %'.
Procesarea Cursorului Implicit
Cursorul implicit este folosit pentru a procesa instruciuni INSERT, UPDATE,
DELETE, i SELECT INTO. n timpul procesrii unui cursor implicit, Oracle execut n
mod automat operaiile OPEN, FETCH, i CLOSE.
Un cursor implicit nu poat s v spun cte linieurile au fost afectate de un
update. SQL%ROWCOUNT returneaz numrul de linieuri care au fost actualizate. El
poate s se ntrebuineze dup cum urmeaz:
SET SERVEROUTPUT ON
BEGIN
UPDATE studeni
SET nume = 'Banu'
WHERE nume LIKE 'B%';
DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT);
END;
Se consider urmtorul exemplu al unui cursor implicit:
SET SERVEROUTPUT ON;
DECLARE
v_nume
VARCHAR2(35);
v_prenume VARCHAR2(35);
BEGIN
SELECT nume, prenume
INTO v_nume, v_prenume
FROM studeni

WHERE student_id = 123;


DBMS_OUTPUT.PUT_LINE (' nume Student: '||
v_nume ||' '|| v_prenume);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE
(nu exista student cu ID 123');
END;
Este important de notat c Oracle asociaz n mod automat un cursor implicit cu o
instruciune SELECT INTO i aduce valori pentru variabilele
v_nume i v_prenume.
Odat ce instruciunea SELECT INTO este terminat, Oracle nchide cursorul implicit.
Spre deosebire de cursorul implicit, cursor explicit este definit de un program
pentru oricare query care returneaz mai mult dect un linie de informaii.
Astfel un cursor explicit se defineste dup cum urmeaz. Mai nti se declar
cursorul, apoi se deschide cursorul declarat, Apoi aducei cursorul ?? declarat i deschis
de mai devreme. n cele din urm se nchide cursorul.
4.2. Cursor Explicit
Singura modalitate de generare ale unui cursor explicit este ca acesta s fie
declarat n seciunea DECLARE a unui blocul PL SQL.
Avantajele de a declara un cursor explicit n locul unui cursor indirect implicit
sunt acelea c, cursorul explicit d mai mult control programarii din mediul de
programare. Cursoare implicite sunt mai puin eficiente dect cursoarele explicite, i
astfel este mai greu de a prinde n curs erorile informaiilor.
Procesul de lucru cu un cursor explicit const in urmtorii paii:
1. Declararea cursorului. Acesta iniializeaz cursorul n memorie.
2. Deschiderea cursorului. Cursorul declarat anterior poate acum s fie
deschis; Memoria este alocat.
3. Aducerea cursorului. Cursorul anterior declarat i deschis poate acum s
recupereze informaii; Acesta este procesul de aducere a cursorului.
4. nchiderea cursorului. Cursorul anterior declarat, deschis, i adus trebuie
acum nchis pentru eliberarea memoriei alocate.
5. Tipuri de nregistrri
O nregistrare este o structur de informaie, care nseamn c este format din
mai mult dect un element. nregistrrile sunt foarte mult similare cu o linie a unui table

dintro baza de date, dar fiecare element al nregistrrii nu depinde de el nsui. PL SQL
are definite trei tipuri de nregistrri:
(1) bazat pe tabel (table-based),
(2) bazat pe cursor (cursor-based),
(3) definite de programator (programmer-defined).
O nregistrare bazat pe tabel(table-based) este o nregistrare a crei structur este
dat de lista de coloane a tabelului.
O nregistrare bazat pe cursor(cursor-based) este o nregistrare a crei structur
se atribuie elementele unui cursor definit anticipat. Pentu a crea o nregistrare bazat pe
tabel sau bazat pe cursor, se foloseste atributul %ROWTYPE.
< nume-inregistrare> < nume-tabel or nume-cursor >%ROWTYPE
De exemplu:
SET SERVEROUTPUT ON
DECLARE
vr_student studenti%ROWTYPE;
BEGIN
SELECT *
INTO vr_student
FROM studenti
WHERE student_id = 156;
DBMS_OUTPUT.PUT_LINE (vr_student. nume||' '
||vr_student.prenume||' are ID 156');
EXCEPTION
WHEN no_data_found
THEN
RAISE_APPLICATION_ERROR(-2001,' Studenti '||
' nu este in basa de date');
END;
Variabila vr_student este de tip nregistrare din tabelul studenti al bazei de date
care exist deja. Aceasta nseamn c ea are aceleai componente cao linie din tabelul
studenti.
O nregistrare bazat pe cursor este cam acelai lucru, cu excepia faptului c este
definit de lista select a cursorului declart.
Cnd facem referire la elementele nregistrrii, folosii aceeai sintax pe care o
folosim la tabele.
Nume-inregistrare. Nume-element
Pentru a defini o variabil care se bazeaz pe o nregistrare a unui cursor, cursorul
trebuie mai nti s fie declarat. n urmtorul laborator, vei porni prin a declara un cursor

i dup aceea vei continua procesul de a deschide cursorul, de a-l aduce, i n cele din
urm nchiderea cursoruli.
O nregistrare bazat pe tabel este definit dintr-o structur particular a unui
tabel. Consideram urmtorul fragment de cod:
DECLARE
vr_zip ZIPCODE%ROWTYPE;
vr_instructor Instructor%ROWTYPE;
nregistrarea vr_zip are structura asemntoare cu o linie a tabelului ZIPCODE.
Elementele lui sunt ORAS, STAT, i ZIP. Este important de notat faptul c in coloana
ORAS a tabelului ZIPCODE a fost definit ca VARCHAR2(15), atributul ORAS al
nregistrrii vr_zip va avea aceeai structur de tip de date (datatype). Similar,
nregistrarea vr_instructor se bazeaz pe o linie a tabelului instructor.
6. Folosirea cursoarelor FOR Loops i Nesting
Obiectivul acestui paragraf este sa invatam cum sa folosim un Cursor FOR Loop
si S procesam Cursoare Nested
Exist o metod alternativ de a manipula cursoare aceasta se numete cursor
FOR loop din cauza sintaxei care se ntrebuineaz. Cnd folosim cursorul FOR loop,
procesul de deschidere, aducere, i nchidere este manipulat n mod implicit. Acesta face
blocul mult mai simplu de a fi codificat i mai uor de ntreinut.
Cursorul FOR Loop specific o succesiune de comenzi ce se repetat odat
pentru fiecare linie ntoars de cursor. Folosim cursorul FOR loop dac avem nevoie de
s ADUCEM i S PROCESAM fiecare nregistrare a cursorului.
De exemplu, presupunem c exist un tabel intitulat log cu o singur coloan:
create table table_log
(description VARCHAR2(250));
DECLARE
CURSOR c_student IS
SELECT id_student, name, prenume
FROM studenti
WHERE id_student < 110;
BEGIN
FOR r_student IN c_student
LOOP
INSERT INTO table_log
VALUES(r_student.nume);

END LOOP;
END;
Urmtorul exemplu este al unui cursor nested. Trecem n revist codul:
SET SERVEROUTPUT ON
DECLARE
v_taxa
course.taxa%TYPE;
v_id_instructor instructor.id_instructor%TYPE;
CURSOR c_inst IS
SELECT nume, prenume, id_instructor
FROM instructor;
CURSOR c_taxa IS
SELECT c.taxa
FROM curs c, sectie s, inscrisi e
WHERE s.id_instructor = v_id_instructor
AND c.curs_no = s.curs_no
AND s.id_sectie = e.id_sectie;
BEGIN
FOR r_inst IN c_inst
LOOP
v_id_instructor := r_id_inst.instructor;
v_ taxa := 0;
DBMS_OUTPUT.PUT_LINE(
' taxa generata de instructor '||
r_inst.nume||' '||r_inst.prenume
||' is');
FOR r_cost IN c_ taxa
LOOP
v_taxa := v_taxa + NVL(r_cost.cost, 0);
END LOOP;
DBMS_OUTPUT.PUT_LINE
(' '||TO_CHAR(v_ taxa,'$999,999'));
END LOOP;
END;

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