P. 1
Baze de date orientate obiect1

Baze de date orientate obiect1

|Views: 4|Likes:
Published by dumisan
Baze de date orientate obiect1
Baze de date orientate obiect1

More info:

Categories:Types, School Work
Published by: dumisan on Jun 17, 2013
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

08/19/2014

pdf

text

original

Sisteme de gestiune a bazelor de date orientate obiect – Master ID Laborator 1 Tipuri de date compuse colecţie (INDEX-BY TABLE, NESTED

TABLE, VARRAY)
- recapitulare
Colecţiile permit să fie prelucrate simultan mai multe variabile de acelaşi tip. Fiecare element are un indice unic, care determină poziţia sa în colecţie. În PL/SQL există trei tipuri de colecţii:

• • •
Obs :

tablouri indexate (index-by tables); tablouri imbricate (nested tables); vectori (varrays sau varying arrays).

- Tipul index-by table poate fi utilizat numai în declaraţii PL/SQL. Tipurile varray şi nested table pot fi utilizate atât în declaraţii PL/SQL, cât şi în declaraţii la nivelul schemei (de exemplu, pentru definirea tipului unei coloane a unui tabel relaţional). - Singura diferenţă sintactică între tablourile indexate şi cele imbricate este clauza INDEX BY. Dacă această clauză lipseşte, atunci tipul este tablou imbricat.

 Atribute şi metode ale unei colecţii: (prezentare succintă)
Atribut sau metodă Descriere

COUNT FIRST LAST EXISTS NEXT PRIOR DELETE EXTEND LIMIT TRIM

numărul componentelor colecţiei Indicele primului element din tablou Indicele ultimului element din tablou întoarce TRUE dacă există în tablou componenta cu indexul specificat returnează indicele următoarei componente returnează indicele componentei anterioare şterge una sau mai multe componente. Adaugă elemente la sfârşit Numărul maxim de elemente al unei colecţii (pentru vectori), null pentru tablouri imbricate şterge elementele de la sfârşitul unei colecţii

Ultimele 3 metode nu sunt valide pentru index-by tables.

 bulk bind permite ca toate liniile unei colecţii să fie transferate simultan printr-o singură operaţie. • este realizat cu ajutorul comenzii FORALL, ce poate fi folosită cu orice tip de colecţie:
FORALL index IN lim_inf..lim_sup comanda_sql; Cursorul SQL are un atribut compus %BULK_ROWCOUNT care numără liniile afectate de iteraţiile comenzii FORALL. %BULK_ROWCOUNT(i) reprezintă numărul de linii procesate de a i-a execuţie a comenzii SQL.

 Regăsirea rezultatului unei interogări în colecţii (înainte de a fi trimisă motorului PL/SQL) se
poate obţine cu ajutorul clauzei BULK COLLECT:

LAST) LOOP DBMS_OUTPUT. TYPE tab_imbri IS TABLE OF NUMBER. END LOOP. o clauza RETURNING INTO a comenzilor INSERT. 2). Exerciţii: 1. Observaţii: • Elementele unui tablou indexat nu sunt într-o ordine particulară şi pot fi inserate cu chei arbitrare.coloană%TYPE [NOT NULL] | nume_tabel%ROWTYPE} INDEX BY tip_indexare. i:= v_tab_imbri. TYPE vector IS VARRAY(15) OF NUMBER. v_vector := vector(1. i INTEGER. WHILE (i <= v_tab_imbri. v_tab_imbri tab_imbri. -. v_tab_imbri := tab_imbri(5. v_tab_index tab_index.PUT_LINE('v_tab_imbri: '||v_tab_imbri(i)).2 …BULK COLLECT INTO nume_colecţie [. DECLARE TYPE tab_index IS TABLE OF NUMBER INDEX BY BINARY_INTEGER. nici chei). 7). BEGIN v_tab_index(1) := 72. END. Afişaţi valorile variabilelor definite. 8. v_vector vector. exemplu dat pentru v_tab_imbri i:=v_tab_imbri. •  Declararea tipului TABLE se face respectând următoarea sintaxă: . • Tabloul indexat PL/SQL nu poate fi iniţializat în declararea sa. / 1. v_tab_index(2) := 23.afisati valorile variabilelor definite. dimensiunea tabloului se modifică dinamic. DELETE.nume_colecţie]…  Clauza poate să apară în: o comenzile SELECT INTO (cursoare implicite). • Deoarece nu există constrângeri de dimensiune. UPDATE. TYPE nume_tip IS TABLE OF {tip_coloană | variabilă%TYPE | nume_tabel. Analizaţi şi comentaţi exemplul următor. o comenzile FETCH INTO (cursoare explicite). 3.FIRST. Tablouri indexate (index-by tables)  Tabloul indexat PL/SQL are două componente: • coloană ce cuprinde cheia primară pentru acces la liniile tabloului o coloană care include valoarea efectivă a elementelor tabloului. • Un tablou indexat neiniţializat este vid (nu conţine nici valori. 2.NEXT(i).

20 LOOP v_tablou(i) := i*i.PUT_LINE('tabloul are ' || v_tablou.v_tablou. -. Să se introducă 20 de elemente în acest tablou. Dacă se face referire la o linie care nu există. --metoda 3 de stergere DBMS_OUTPUT.  Pentru a şterge liniile unui tablou fie se asignează elementelor tabloului valoarea null.tablou folosit pentru stergere BEGIN FOR i IN 1. END LOOP. Să se iniţializeze un element al tabloului şi să se introducă în tabelul dept_pnu.  Pentru regăsirea unor valori dintr-o coloană a unei baze de date într-un tablou PL/SQL se utilizează instrucţiunea FETCH (cursoare) sau instrucţiunea de atribuire în cadrul unei secvenţe repetitive LOOP.metoda 1 de stergere v_tablou(i) := NULL. Să se afişeze.. END. --sau v_tablou := v_aux.LAST LOOP -. Exerciţii: 2.. În PL/SQL 2. DBMS_OUTPUT. v_tablou tablou_numar. / 3. END LOOP. fie se declară un alt tablou PL/SQL (de acelaşi tip) care nu este iniţializat şi acest tablou vid se asignează tabloului PL/SQL care trebuie şters.metoda 2 de stergere --sau v_tablou. Să se definească un tablou indexat PL/SQL având elemente de tipul NUMBER.COUNT || ' elemente'). apoi să se şteargă tabloul utilizând diverse metode.FIRST. . v_aux tablou_numar.PUT_LINE(v_tablou(i)). Să se definească un tablou de înregistrări având tipul celor din tabelul dept_pnu. Să se şteargă elementele tabloului.delete.3 ştergerea liniilor unui tabel se poate face utilizând metoda DELETE. --aceasta atribuire da eroarea PLS-00382 FOR i IN v_tablou. --v_tablou := NULL. -. DECLARE TYPE tablou_numar IS TABLE OF NUMBER INDEX BY PLS_INTEGER. •  Pentru inserarea unor valori din tablourile PL/SQL într-o coloană a unui tabel de date se utilizează instrucţiunea INSERT în cadrul unei secvenţe repetitive LOOP.3 • Un element al tabloului este nedefinit atâta timp cât nu are atribuită o valoare efectivă. atunci se produce excepţia NO_DATA_FOUND.

location_id := 2700. -. END IF. Analizaţi şi comentaţi exemplul următor. Exerciţii: 4.department_id.location_id). DECLARE TYPE secventa IS VARRAY(5) OF VARCHAR2(10). dept_table(i).department_name. dept_table(i). 2 Vectori (varray) • Vectorii (varray) sunt structuri asemănătoare vectorilor din limbajele C sau Java. -.department_name := 'NewDep'. În special. • Fiecare element are un index. ELSE i:=1. -. . i NUMBER. department_name. v_sec secventa := secventa ('alb'.  Tipul de date vector este declarat utilizând sintaxa: TYPE nume_tip IS {VARRAY | VARYING ARRAY} (lungime_maximă) OF tip_elemente [NOT NULL]. location_id) VALUES (dept_table(i). BEGIN v_sec (3) := 'rosu'.department_id := 92. 'rosu'.LAST+1.adauga un element null v_sec(5) := 'albastru'.PUT_LINE('Dupa aplicarea metodei DELETE sunt '||TO_CHAR(dept_table. BEGIN IF dept_table. dept_table dept_pnu_table_type. END.COUNT <>0 THEN i := dept_table. se utilizează pentru modelarea relaţiilor one-to-many. 'negru'.EXTEND. trebuie să declarăm în SQL tipuri de date care să îi reprezinte. • Vectorii au o dimensiune maximă (constantă) stabilită la declarare. atunci când numărul maxim de elemente din partea „many“ este cunoscut şi ordinea elementelor este importantă. dept_table. / Obs : Pentru a putea reţine şi utiliza tablourile imbricate şi vectorii.extinderea la 6 elemente va genera eroarea ORA-06532 v_sec. 'verde'). INSERT INTO dept_pnu(department_id.INSERT INTO dept_pnu -.EXTEND.DELETE. END. dept_table(i). -.sau folosind noua facilitate Oracle9i -.. dept_table(i). dept_table(i). v_sec.4 DECLARE TYPE dept_pnu_table_type IS TABLE OF dept_pnu%ROWTYPE INDEX BY BINARY_INTEGER.sterge toate elementele DBMS_OUTPUT. a cărui limită inferioară este 1.COUNT)||' elemente').VALUES dept_table(i).

Se va utiliza un vector corespunzător codurilor angajaţilor. END. deci trebuie declarat prin comanda: CREATE TYPE nume_tip AS {TABLE | VARRAY} OF tip_elemente. v_proiect(1) := ‘proiect 1’. Se cer 3 soluţii. INSERT INTO test_pnu VALUES (1. END IF. BEGIN FOR contor IN (SELECT * FROM emp_pnu) LOOP IF contor.COUNT) := contor.extend. / 6. b) Să se creeze un tabel test_pnu având o coloana cod_ang de tip NUMBER(4) şi o coloană proiecte_alocate de tip proiect_pnu.extend (2). Department_id =50 AND contor. END LOOP. END LOOP.5 Tablourile imbricate şi vectorii pot fi utilizaţi drept câmpuri în tabelele bazei.employee_id%TYPE .1 WHERE employee_id = v_id (contor). Aceasta presupune că fiecare înregistrare din tabelul respectiv conţine un obiect de tip colecţie. tipul trebuie stocat în dicţionarul datelor. v_proiect).COUNT LOOP UPDATE emp_pnu SET salary = salary *1. Blocul PL/SQL: DECLARE v_proiect proiect_pnu := proiect_pnu(). V_id(v_id. introduce valori în aceasta iar apoi valoarea vectorului respectiv este introdusă pe una din liniile tabelului test_pnu. a) Să se declare un tip proiect_pnu care poate reţine maxim 50 de valori de tip VARCHAR2(15).salary < 5000 THEN V_id. proiecte_alocate proiect_pnu).employee_id. . / Soluţia 2 (varianta FORALL): DECLARE TYPE t_id IS VARRAY(100) OF emp_pnu. --initializare utilizând constructorul BEGIN v_proiect. Să se scrie un bloc care măreşte salariile angajaţilor din departamentul 50 cu 10%. v_proiect(2) := ‘proiect 2’ . END.employee_id%TYPE . FOR contor IN 1. v_id t_id := t_id().v_id.. Soluţia 1 : DECLARE TYPE t_id IS VARRAY(100) OF emp_pnu. Ce relaţie se modelează în acest fel? c) Să se creeze un bloc PL/SQL care declară o variabilă (un vector) de tip proiect_pnu. La promptul SQL : CREATE TYPE proiect_pnu AS VARRAY(50) OF VARCHAR2(15) / CREATE TABLE test_pnu (cod_ang NUMBER(4). Înainte de utilizare. 5. în cazul în care salariul este mai mic decât 5000.

. acesta trebuie sa fie initializat cu ajutorul constructorului. pentru a insera un element nou.employee_id%TYPE .. nu au dimensiune limitată. o o o o o sunt asemenea unor tabele cu o singură coloană. / Obs: Prin comanda FORALL sunt trimise toate datele pe server. metoda NEXT ne permite să ajungem la următorul element . executându-se apoi o singură comandă SELECT.salary < 5000 THEN V_id.COUNT UPDATE emp_pnu SET salary = salary *1. un tablou imbricat este dens (are elementele pe poziţii consecutive) dar pot apărea spaţii goale prin ştergere . Department_id =50 AND contor.extend. END. END LOOP.employee_id.v_id.1 WHERE employee_id = v_id (contor). o folosesc drept indici numere consecutive .COUNT UPDATE emp_pnu SET salary = salary *1. FORALL contor IN 1.  Comanda de declarare a tipului de date tablou imbricat are sintaxa: TYPE nume_tip IS TABLE OF tip_ elemente [NOT NULL]. FORALL contor IN 1. END IF. V_id(v_id. / 3 Tablouri imbricate •Tablourile imbricate (nested table) sunt tablouri indexate a căror dimensiune nu este stabilită. END. BEGIN FOR contor IN (SELECT * FROM emp_pnu) LOOP IF contor. o pot fi prelucrate direct în instrucţiuni SQL o au excepţii predefinite proprii. Soluţia 3 (varianta BULK COLLECT): DECLARE TYPE t_id IS VARRAY(100) OF emp_pnu. UPDATE etc. v_id t_id := t_id().COUNT) := contor. tabloul trebuie extins cu metoda EXTEND(nr_comp) . •Un tablou imbricat este o mulţime neordonată de elemente de acelaşi tip.1 WHERE employee_id = v_id (contor). iniţial.6 v_id t_id := t_id().  Pentru adaugarea de linii intr-un tablou imbricat. Valorile de acest tip: o pot fi stocate în baza de date. ele cresc dinamic. . BEGIN SELECT employee_id BULK COLLECT INTO v_id FROM emp_pnu WHERE department_id =50 AND salary < 5000.v_id.

END. 'a'.NEW_LINE. o Constructorul primeşte ca argumente o listă de valori numerotate în ordine. 14.PRIOR(v_Index). Să se declare un tip tablou imbricat şi o variabilă de acest tip. o Pentru vectori nu poate fi depăşită dimensiunea maximă precizată la declarare. . 'I'.EXISTS(v_Count) THEN DBMS_OUTPUT. v_IndexByTable IndexByNumTab. WHILE v_Index >= v_Characters.LAST. v_Index := v_Characters. dar care are valoarea not null. 'm'. BEGIN v_Index := v_Characters. o Exerciţii: 7. / 8. o Atunci când constructorul este fără argumente.PUT(v_Characters(v_Index)). 'a'. END LOOP. o Dimensiunea iniţială a colecţiei este egală cu numărul de argumente date în constructor. 'a'. de la primul la ultimul element şi invers. Atribuiţi valorile tabloului unui tablou index-by. DBMS_OUTPUT. v_Index := v_Characters. 'm'. END LOOP.PUT_LINE( 'v_NestedTable(' || v_Count || '): ' || v_NestedTable(v_Count)).FIRST LOOP DBMS_OUTPUT. v_Count := v_Count + 1. Tabelele indexate nu au constructori. v_IndexByTable(v_count) := v_NestedTable(v_count). Afişaţi conţinutul acestuia. ''''.PUT(v_Characters(v_Index)). DECLARE -. utilizând metoda EXISTS.NEXT(v_Index). ' '. DBMS_OUTPUT. BEGIN LOOP IF v_NestedTable. nu sunt declarate tipurile! v_NestedTable NumTab := NumTab(-7. Afişaţi şi acest tablou. 'm'). va crea o colectie fără nici un element (vida). END IF. v_Index INTEGER. de la 1 la numărul de valori date ca parametrii constructorului. NULL. '. END LOOP. v_Count BINARY_INTEGER := 1.3.'. 'd'. 0).cod partial. Iniţializaţi variabila şi afişaţi conţinutul tabloului. când aceasta este iniţializată.7 o PL/SQL apelează un constructor numai în mod explicit.NEW_LINE. ' '. v_Characters CharTab := CharTab('M'. numit NumTab. 'A'.14159.LAST LOOP DBMS_OUTPUT. WHILE v_Index <= v_Characters. v_Index := v_Characters. ELSE EXIT. Creaţi un tip tablou imbricat.FIRST. 'd'. 3. in ordine inversă. DECLARE TYPE CharTab IS TABLE OF CHAR(1).

END IF.PUT_LINE( 'v_IndexByTable(' || v_Count || '): ' || v_IndexByTable(v_Count)). Analizaţi următorul exemplu.PUT_LINE('tab2 este NULL'). /* declanseaza exceptia VALUE_ERROR deoarece indicele nu este convertibil la intreg */ .atribuire invalida -.PUT_LINE('tab2 este NOT NULL'). el este initializat. IF tab2 IS NULL THEN DBMS_OUTPUT.1. alfa numar. ELSE DBMS_OUTPUT. END IF. END. -. /* creeaza un tablou cu un element care este null. poate primi elemente */ tab2 alfa := alfa() .EXISTS(v_Count) THEN DBMS_OUTPUT. Să se analizeze următorul bloc PL/SQL. alfa(1) := ASCII('X'). / 10.v_IndexByTable := v_NestedTable.COUNT. v_Count := v_IndexByTable. alfa('P') := 77. ELSE EXIT. ELSE DBMS_OUTPUT. END. 37). END IF. END. BEGIN IF tab1 IS NULL THEN DBMS_OUTPUT. v_Count := v_Count .PUT_LINE('tab1 este NOT NULL').declanseaza exceptia COLLECTION_IS_NULL alfa := numar(15.8 -.creeaza un tablou (atomic) null tab1 alfa . BEGIN alfa(1) := 77. urmărind excepţiile semnificative care apar în cazul utilizării incorecte a colecţiilor: DECLARE TYPE numar IS TABLE OF INTEGER. LOOP IF v_IndexByTable. END LOOP. / 9. dar tabloul nu este null.PUT_LINE('tab1 este NULL'). alfa(2) := 10*alfa(1). Ce se obţine în urma execuţiei acestuia ? DECLARE TYPE alfa IS TABLE OF VARCHAR2(50). 26. -.

6.se adauga un element de tip vector la vbet vbet(5) := alfa(56. vbet(4) := alfa(44.valf). -.33).9 alfa(4) := 47.66. i integer. variabilelor PL/SQL. /* declanseaza exceptia SUBSCRIPT_BEYOND_COUNT deoarece indicele se refera la un element neinitializat */ alfa(null) := 7.alfa(55. Obiectele de tipul colecţie pe mai multe niveluri nu pot fi comparate. Exemplele se referă la vectori pe mai multe niveluri. var1 alfa. Aceste structuri complexe pot fi utilizate ca tipuri de date pentru definirea: • • coloanelor unui tabel relaţional. În felul acesta pot fi definite structuri complexe: vectori de vectori. Numărul nivelurilor de imbricare este limitat doar de capacitatea de stocare a sistemului. Pentru a accesa un element al colecţiei incluse sunt utilizate două seturi de paranteze.77). -. DECLARE TYPE alfa IS VARRAY(10) OF INTEGER.i va lua valoarea 77 vbet. în mod direct sau indirect. --initializare vbet beta := beta(valf.DELETE(1). tablouri imbricate pe mai multe niveluri şi tablouri indexate pe mai multe niveluri.5).31. / DECLARE TYPE gama IS TABLE OF VARCHAR2(20).alfa(2. valf alfa := alfa(12. În exemplele care urmează sunt definite trei structuri complexe şi sunt prezentate câteva modalităţi de utilizare ale acestora. tablou imbricat de tablouri imbricate. tablou imbricat de vectori.exceptia NO_DATA_FOUND … END. -.4321). -. TYPE beta IS VARRAY(10) OF alfa. . BEGIN i := vbet(2)(3). -. colecţii. vectori de tablouri imbricate. vbet(4)(4) := 7.4321 este inlocuit cu 7 vbet(4).77. prin urmare colecţii ale căror elemente sunt.EXTEND. / 4 Colecţii pe mai multe niveluri În Oracle9i se pot construi colecţii pe mai multe niveluri ( multilevel collections). tablou imbricat sau vector de un tip definit de utilizator care are un atribut de tip tablou imbricat sau vector.se adauga un element la al 4-lea element vbet(4)(5) := 777. atributelor unui obiect într-un tabel obiect.4). IF alfa(1) = 1 THEN … -. • • • • Observaţii: Exemplu: 11.exceptia SUBSCRIPT_OUTSIDE_LIMIT alfa.acest nou element adaugat va fi 777 END.EXTEND. -. -.declanseaza exceptia VALUE_ERROR alfa(0) := 7.

var4(2) := 222. var3(39) := gama(77. eroare nu exista element 40 in var2 var2(40) := var5. -. / 5 Prelucrarea colecţiilor o INSERT .5)). -.sterge primul element din var2 /* sterge primul sir de caractere din al doilea tablou al tabloului imbricat */ var2(2). / DECLARE TYPE alfa IS TABLE OF INTEGER INDEX BY BINARY_INTEGER. operaţiile pot fi făcute numai atomic. var2 beta. BEGIN var2. Operatorul permite interogarea unei colecţii în clauza FROM (la fel ca un tabel).permite inserarea unei colecţii într-o linie a unui tabel.76. END. var4 alfa. DELETE poate şterge o linie ce conţine o colecţie. var5 alfa. var1 gama := gama('alb'.var2(40)(3) := 55.908). var2(27) := var4. var3 delt. var2.EXTEND. -.corect END. elemente individuale. TYPE epsi IS TABLE OF teta.10 TYPE delta IS TABLE OF gama.tablou vid BEGIN var4(1) := 324. var3 epsi := epsi(teta(31.teta(1. o Pentru tablouri imbricate pe mai multe niveluri. var4(42) := 333. var2 delta := delta(var1). CAST are forma sintactică: CAST (nume_colecţie AS tip_colecţie) . Colecţia trebuie să fie creată şi iniţializată anterior.3.asignez un tablou null var2(40)(3) := 55. utilizând comanda SELECT. -. operaţiile LMD pot fi făcute atomic sau pe o Pentru prelucrarea unei colecţii locale se poate folosi şi operatorul CAST.DELETE(1). var1 gama := gama('alb'. TYPE teta IS VARRAY(10) OF INTEGER. TYPE gama IS VARRAY(10) OF VARCHAR2(30). TYPE beta IS TABLE OF alfa INDEX BY BINARY_INTEGER. Colecţiile din baza de date pot fi regăsite în variabile PL/SQL.DELETE(1). iar pentru vectori pe mai multe niveluri. o o o o UPDATE este folosită pentru modificarea unei colecţii stocate.89.'negru'). operatorul TABLE permite prelucrarea elementelor unui tablou imbricat care este stocat întrun tabel.15). var2(2) := var2(1). -.'negru'). TYPE delt IS TABLE OF gama INDEX BY BINARY_INTEGER.

PUT_LINE(v_info(i)).next(i).last) loop DBMS_OUTPUT. . CREATE OR REPLACE TYPE list_ang_pnu AS VARRAY(10) OF NUMBER(4) / CREATE TABLE job_emp_pnu ( cod_job NUMBER(3). a) Să se creeze un tip LIST_ANG_PNU. b) Să se creeze un tabel JOB_EMP_PNU. i := v_info. v_cod job_emp_pnu. titlu_job de tip VARCHAR2(25) şi info de tip LIST_ANG_PNU.PUT_LINE('v_info:'). END.FIRST. 124. info list_ang_pnu). c) Să se creeze un bloc PL/SQL care declară şi iniţializează două variabile de tip LIST_ANG_PNU. DECLARE v_list list_ang_pnu := list_ang_pnu (123. 13.info%TYPE. i := v_info. având coloanele: cod_job de tip NUMBER(3). / ROLLBACK. Selectaţi-l din tabel. o variabilă de tipul coloanei info din tabelul JOB_EMP_PNU şi o variabilă de tipul codului job-ului. Creati un tabel FAMOUS_DATES_PNU având o coloană de acest tip. Obs: După crearea tabelului (prin comanda CREATE TABLE). BEGIN INSERT INTO job_emp_pnu VALUES (5. cu maxim 10 componente de tip NUMBER(4). Declaraţi o variabilă de tip DateTab_pnu şi adăugaţi-i 5 date calendaristice. 125). while (i <= v_info.cod_job%TYPE := 7. end loop. v_info_list). i INTEGER. v_info job_emp_pnu. titlu_job VARCHAR2(25). de tip vector. 'Inginer'. Să se insereze prin diverse metode 3 înregistrări în tabelul JOB_EMP_PNU. v_info_list list_ang_pnu := list_ang_pnu (700). list_ang_pnu (456. pentru fiecare câmp de tip tablou imbricat din tabel este necesară clauza de stocare: NESTED TABLE nume_câmp STORE AS nume_tabel. Ştergeţi al doilea element şi apoi introduceţi tabloul în tabelul FAMOUS_DATES_PNU.11 Exerciţii: 12. Creaţi un tip de date tablou imbricat DateTab_pnu cu elemente de tip DATE. În SQL*Plus: DROP TABLE famous_dates_pnu. 'Analist'. 457)). INSERT INTO job_emp_pnu VALUES (10. INSERT INTO job_emp_pnu VALUES (7. v_list). SELECT info INTO v_info FROM job_emp_pnu WHERE cod_job = v_cod. Afişaţi la fiecare pas. 'Programator'. --afisare v_info DBMS_OUTPUT.

Procedura locala pentru afisarea unui DateTab. -. TO_DATE('01-JAN-2001'.LAST LOOP DBMS_OUTPUT.NEXT(v_Index). 'DD-MON-YYYY')). job VARCHAR2(20)). date_list DateTab_pnu) NESTED TABLE date_list STORE AS dates_tab.PUT_LINE('Valoarea initiala a tabloului'). TO_DATE('05-JUN-1968'.tabloul va avea numai 4 elemente INSERT INTO famous_dates_pnu (key. BEGIN DBMS_OUTPUT. / CREATE TABLE famous_dates_pnu ( key VARCHAR2(100) PRIMARY KEY. CREATE OR REPLACE TYPE rec_info_pnu IS OBJECT (cod_ang NUMBER(4). date_list) VALUES ('Date importante'. 14. Să se insereze o linie în tabelul imbricat. 'DD-MON-YYYY')).DELETE(2). / CREATE OR REPLACE TYPE dept_info_pnu IS TABLE OF rec_info_pnu.PUT_LINE('Tabloul dupa INSERT si SELECT:'). 'DD-MON-YYYY'). END Print.12 DROP TYPE DateTab_pnu. Blocul PL/SQL: DECLARE v_Dates DateTab_pnu := DateTab_pnu(TO_DATE('04-JUL-1776'. PROCEDURE Print(p_Dates IN DateTab_pnu) IS v_Index BINARY_INTEGER := p_Dates. 'DD-MON-YYYY'). v_Dates). CREATE OR REPLACE TYPE DateTab_pnu AS TABLE OF DATE. 'DD-MON-YYYY'). Print(v_Dates). TO_DATE('12-APR-1861'. DBMS_OUTPUT. DBMS_OUTPUT. TO_DATE('26-JAN-1986'. Să se listeze codurile departamentelor şi colecţia angajaţilor corespunzători. v_Index := p_Dates.FIRST. / ROLLBACK. END LOOP. / .PUT(' ' || v_Index || ': '). SELECT date_list INTO v_Dates FROM famous_dates WHERE key = 'Date importante'. BEGIN WHILE v_Index <= p_Dates. Să se adauge o coloană info de tip tablou imbricat în tabelul DEPT_PNU.PUT_LINE(TO_CHAR(p_Dates(v_Index). END. Print(v_Dates). -. v_Dates. Acest tablou are două componente în care pentru fiecare departament sunt depuse codul unui angajat şi job-ul acestuia. 'DD-MON-YYYY').

500 LOOP v_Numbers(v_Count) := v_Count. v_Numbers t_Numbers.. având o coloană de tip numeric şi alta de tip şir de caractere. FOR v_Count IN 1..500 LOOP . TYPE t_Chars IS TABLE OF temp_table_pnu. Să se creeze un tabel temporar TEMP_TABLE_PNU cu datele persistente la nivel de sesiune. 'MyEmp'). END.* FROM dept_pnu d. / DECLARE TYPE t_Numbers IS TABLE OF temp_table_pnu.department_id. END LOOP.num_col%TYPE INDEX BY BINARY_INTEGER. v_Chars t_Chars. 15.. char_col VARCHAR2(20)) ON COMMIT PRESERVE ROWS. SET DESCRIBE DEPTH ALL LINENUM ON INDENT ON DESC dept_pnu UPDATE dept_pnu SET info=dept_info_pnu() WHERE department_id=90.char_col%TYPE INDEX BY BINARY_INTEGER. BEGIN FOR v_Count IN 1. SELECT d. v_Numbers t_Numbers. CREATE GLOBAL TEMPORARY TABLE temp_table_pnu ( num_col NUMBER(6). TABLE (d. v_Chars(v_Count)).info) t. TYPE t_Chars IS TABLE OF temp_table_pnu. Comentaţi diferenţele între variantele propuse. INSERT INTO TABLE (SELECT info FROM dept_pnu WHERE department_id = 90) VALUES (100. DECLARE TYPE t_Numbers IS TABLE OF temp_table_pnu.char_col%TYPE INDEX BY BINARY_INTEGER. Prin intermediul unui tablou indexat.13 ALTER TABLE dept_pnu ADD (info dept_info_pnu) NESTED TABLE info STORE AS info_tab.num_col%TYPE INDEX BY BINARY_INTEGER. să se adauge 500 de linii în acest tabel. Se cer două variante.500 LOOP INSERT INTO temp_table_pnu VALUES (v_Numbers(v_Count). BEGIN FOR v_Count IN 1. v_Chars t_Chars. v_Chars(v_Count) := 'Row number ' || v_Count. END LOOP. t.

Să se declare un TIP T_MULTIVARRAY de elemente T_NUMBERS şi un tip tablou imbricat de elemente T_NUMBERS. TYPE t_MultiVarray IS VARRAY(10) OF t_Numbers. salary.500 INSERT INTO temp_table_pnu VALUES (v_Numbers(v_Count). v_LastName employees. Ştergeţi apoi linia corespunzătoare acelui rowid şi afişaţi informaţiile corespunzătoare. / 16. obţinându-se rowid-ul acesteia. DBMS_OUTPUT. . v_FirstName employees. 'Xavier'. Măriţi cu 30% salariul angajatului cu rowid-ul respectiv şi obţineţi numele şi prenumele acestuia. DECLARE –acesta este doar codul partial! TYPE t_Numbers IS TABLE OF NUMBER INDEX BY BINARY_INTEGER. TYPE t_MultiNested IS TABLE OF t_Numbers.3 WHERE rowid = v_NewRowid RETURNING first_name. BEGIN -. 'Juan'. v_LastName. v_MultiNumbers t_MultiNumbers. last_name. END. DECLARE v_NewRowid ROWID. Să se afişeze valoarea obţinută.PUT_LINE(' rowid-ul noii linii este ' || v_NewRowid).first_name%TYPE.'jxav'.last_name%TYPE. BEGIN v_MultiNumbers(1)(1) := 12345. 'MK_MAN'. 2000. END LOOP. numit T_MULTINUMBERS. TYPE t_MultiNumbers IS TABLE OF t_Numbers INDEX BY BINARY_INTEGER. job_id. SYSDATE) RETURNING rowid INTO v_NewRowid.. / 17. iniţializaţi-o şi apoi afişaţi. email. UPDATE emp_pnu SET salary = salary * 1.14 v_Numbers(v_Count) := v_Count.employee_id%TYPE. Să se insereze o linie nouă în tabelul EMP_PNU. hire_date) VALUES (emp_sequence. END.PUT_LINE('ID-ul noii linii a fost ' || v_ID). Să se declare un tip tablou indexat de numere T_NUMBERS şi un tip tablou indexat de elemente de tip T_NUMBERS. DELETE FROM emp_pnu WHERE rowid = v_NewRowid RETURNING employee_id INTO v_ID. Declaraţi o variabilă de fiecare din aceste tipuri. v_Chars(v_Count) := 'Row number ' || v_Count. FORALL v_Count IN 1. DBMS_OUTPUT. first_name. v_ID employees. DBMS_OUTPUT. numit T_MULTINESTED.NEXTVAL. v_Chars(v_Count)).Insereaza o linie noua in tabelul emp_pnu si obtine rowid-ul acesteia INSERT INTO emp_pnu (employee_id. last_name INTO v_FirstName.PUT_LINE('Name: ' || v_FirstName || ' ' || v_LastName).

BEGIN v_EmpList(1) := EmpTab( … ). Atribuiţi valori pentru câmpurile last_name şi first_name ale altui element. v_Emp(1). Definiţi o variabilă de tip EmpTab şi apoi inseraţi linia corespunzătoare în tabelul EMP_PNU. Definiţi un tip tablou imbricat EmpTab cu elemente de tipul liniilor tabelului EMP_PNU. v_EmpList EmpTab. DECLARE TYPE EmpTab IS TABLE OF employees%ROWTYPE INDEX BY BINARY_INTEGER.15 END. / 18. --afisare … END. Afişaţi. BEGIN SELECT * INTO v_Emp(200) FROM employees WHERE employee_id = 200. DECLARE –cod partial! TYPE EmpTab IS TABLE OF emp_pnu%ROWTYPE. / . /* Fiecare element al lui v_Emp este o înregistrare */ v_Emp EmpTab.last_name := 'Lemon'. v_Emp(1). / 19. … END.first_name := 'Larry'. Declaraţi un tip EmpTab de tip tablou indexat de tablouri imbricate de linii din tabelul EMPLOYEES. Inseraţi într-unul din elementele tabloului informaţiile corespunzătoare angajatului având codul 200. Declaraţi o variabilă de acest tip.

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->