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