Baze de date c2_colectii

26
7/23/2019 Baze de date c2_colectii http://slidepdf.com/reader/full/baze-de-date-c2colectii 1/26 Tipuri de date în PL/SQL Fiecare variabilă sau constantă utilizată într-un bloc  PL/SQL este de un anumit tip prin care se specifică: formatul său de stocare, constrângerile care trebuie să le verifice domeniul valorilor sale. Variabilele folosite în Oracle9i pot fi: specifice PL/SQL; nespecifice PL/SQL. Variabile specifice PL/SQL se clasifică în variabile: de tip scalar, compuse, referinţă,  LOB (large objects, tipuri obiect. Variabile nespecifice PL/SQL pot fi: variabile de legătură (bind variables, variabile gazdă (host variables, variabile indicator.

Transcript of Baze de date c2_colectii

Page 1: Baze de date c2_colectii

7/23/2019 Baze de date c2_colectii

http://slidepdf.com/reader/full/baze-de-date-c2colectii 1/26

Tipuri de date în PL/SQL

Fiecare variabilă sau constantă utilizată într-un bloc  PL/SQL este de unanumit tip prin care se specifică:

• formatul său de stocare,• constrângerile care trebuie să le verifice

• domeniul valorilor sale.

Variabilele folosite în Oracle9i pot fi:

• specifice PL/SQL;

• nespecifice PL/SQL.

Variabile specifice PL/SQL se clasifică în variabile:

• de tip scalar,• compuse,

• referinţă,

•  LOB (large objects,

• tipuri obiect.

Variabile nespecifice PL/SQL pot fi:

• variabile de legătură (bind variables,

• variabile gazdă (host variables,

• variabile indicator.

Page 2: Baze de date c2_colectii

7/23/2019 Baze de date c2_colectii

http://slidepdf.com/reader/full/baze-de-date-c2colectii 2/26

Variabile specifice PL/SQL

Tipurile de date scalare !u au componente interne (conţin valori atomice. "e împart în # clase.

• $ipurile de date ce stoc%ează valori numerice cuprind tipul NUMBE

cu subtipurile  !E" ,  !E"#M$L,  !OUBLE PE"#S#ON ,  %LO$& , #N&E'E,  #N& ,  NUME#" ,  E$L, SM$LL#N& & tipul B#N$()#N&E'E  cu subtipurile  N$&U$L,  N$&U$LN , POS#&#*E , POS#&#*EN , S#'N&(PE & tipul PLS)#N&E'E.

• $ipurile de date ce stoc%ează caractere cuprind tipul *$"+$,  cu

subtipurile S&#N', *$"+$& tipul de date "+$  cu subtipul"+$$"&E& tipurile LON', $- , LON' $- , O-#!.

• $ipurile de date ce stoc%ează data calendaristică şi ora  cuprindtipurile  !$&E , &#MES&$MP , &#MES&$MP -#&+ &#ME ONE ,&#MES&$MP -#&+ LO"$L &#ME ONE ,  #N&E*$L (E$ &O

 MON&+ , #N&E*$L !$( &O SE"ON!.

• $ipurile de date globalizare ce stoc%ează date nicode includ tipurile N"+$ 'i N*$"+$,.

• $ipul de date BOOLE$N  stoc%ează valori logice (tre, 0alse sau nll .

Tipurile de date compuse 

u componente interne care pot fi manipulate individual. Oracle  oferă programatorului două tipuri de date compuse:

• înregistrare ( E"O!&

• colecţie ( #N!E12B( &$BLE , NES&E! &$BLE , *$$( .

Tipurile de date referinţă  E% "USO si  E% obiect  sunt tipuri de date ale căror valori, numite

 3ointeri, fac referinţă către obiecte din program. )ointerii conţin locaţia dememorie (adresa unui element 'i nu elementul în sine. $ipul E% "USO estefolosit pentru a face referinţă la un cursor e*plicit. $ipul  E% obiect   facereferinţă la adresa unui obiect.

Tipurile de date LOB 

 Large object   sunt acele tipuri de date ale căror valori, numite locatori

(locators specifică localizarea unor obiecte de dimensiuni mari, adică blocuri

+

Page 3: Baze de date c2_colectii

7/23/2019 Baze de date c2_colectii

http://slidepdf.com/reader/full/baze-de-date-c2colectii 3/26

de date nestructurate, cum ar fi te*te, imagini grafice, clipuri video 'i sunete.$ipurile LOB sunt manipulate cu autorul pac%etului !BMS)LOB.

ceste tipuri sunt:

• "LOB (character large object ,

•  BLOB (binar4 large object ,

•  B%#LE  (binar4 0ile,

•  N"LOB (national langage character large object .

Tipurile obiect "unt tipuri compuse, definite de utilizator, care încapsulează structuri de

date (atribute împreună cu subprograme pentru manipularea datelor (metode.

intre tipurile scalare PL/SQL, următoarele sunt 'i tipuri SQL (adică pot fifolosite pentru coloanele tabelelor Oracle:  NUMBE, *$"+$,, "+$,

 LON',  $- ,  LON' $- ,  O-#!,  N"+$,  N*$"+$,,  !$&E . n unelecazuri, tipurile de date  PL/SQL diferă de corespondentele lor SQL  prindimensiunea ma*imă permisă.

$ipul NUMBE memorează numerele în virgulă fi*ă 'i virgulă mobilă. /lare forma generală NUMBE  (5, n, unde 5 reprezintă numărul total de cifre,iar n numărul de zecimale. Valoarea unei variabile de tip NUMBE este cuprinsă

între 0.1/-0+2 'i 2.22/0+#. !umărul de zecimale determină poziţia în careapare rotunirea. Valoarea sa este cuprinsă între -34 'i 0+5, iar implicit este 1.$ipul  NUMBE are următoarele subtipuri, care au acelea'i intervale de

valori:  NUME#" ,  E$L,  !E" ,  !E"#M$L  'i  !OUBLE PE"#S#ON   (pentrumemorarea datelor numerice în virgulă fi*ă, %LO$&  (pentru memorarea datelor numerice în virgulă mobilă, SM$LL#N& ,  #N&E'E  'i  #N& (pentru memorareanumerelor întregi. ceste subtipuri se pot utiliza pentru compatibilitate

 $NS#/#SO, #BM SQL/!S  sau #BM !B,.

$ipul  B#N$()#N&E'E  memorează numere întregi cu semn având

valori cuprinse între -+60

  - 0 'i +60

 - 0. cest tip de date este utilizat frecvent pentru indec'ii tabelelor, nu necesită conversii 'i admite mai multe subtipuri. ee*emplu, pentru a restricţiona domeniul variabilelor la valori întregi nenegativese utilizează tipurile N$&U$L (1 .. +60  7 0 'i POS#&#*E  (0 .. +60 7 0.

$ipul  PLS)#N&E'E este utilizat pentru stocarea numerelor întregi cusemn 'i are acela'i interval de definire ca 'i tipul B#N$()#N&E'E. 8peraţiilecu acest tip sunt efectuate mai rapid (folosesc aritmetica ma'inii, decât cele cutipurile  NUMBE  sau  B#N$()#N&E'E  (folosesc librării aritmetice. )rinurmare, pentru o mai bună performanţă, este preferabil să se utilizeze tipul

 PLS)#N&E'E.

6

Page 4: Baze de date c2_colectii

7/23/2019 Baze de date c2_colectii

http://slidepdf.com/reader/full/baze-de-date-c2colectii 4/26

Variabilele alfanumerice pot fi de tip "+$, *$"+$,, LON', $-  'i

 LON'$- . 9eprezentarea internă depinde de setul de caractere ales ( $S"##  sau EB"!#" .

$ipurile "+$, *$"+$,  'i  $-   pot avea un parametru pentru a preciza lungimea ma*imă. acă aceasta nu este precizată atunci, implicit, seconsideră 0. ungimea este e*primată în octeţi (nu în caractere. "ubtipurileacestor tipuri se pot utiliza pentru compatibilitate $NS#/#SO,  #BM SQL/!S   sau

 #BM !B,.n Oracle9i a fost e*tinsă sinta*a pentru "+$ 'i *$"+$,, permiţând

ca variabila ce precizează lungimea ma*imă să fie de tip "+$ sau B(&E .

Variabilele de tip  LON'  pot memora te*te, tabele de caractere saudocumente, prin urmare 'iruri de caractere de lungime variabilă de până la6+5;1 octeţi. /ste similar tipului *$"+$,.

$ipul  $-   permite memorarea datelor binare (biţi sau a 'irurilor deocteţi. e e*emplu, o variabilă  $-   poate memora o secvenţă de caracteregrafice sau o imagine digitizată. $ipul $-  este similar tipului alfanumeric, cue*cepţia faptului că  PL/SQL nu interpretează datele de tip $- . Oracle nu faceconversia datelor de acest tip, atunci când se transmit de la un sistem la altul.

<%iar dacă lungimea ma*imă a unei variabile $-  poate fi 6+5;5 octeţi, într-ocoloană $- a bazei de date nu se pot introduce decât +111 octeţi. )entru ainsera valori mai mari se folose'te o coloană de tip  LON' $- , care arelungimea ma*imă +60 octeţi. LON' $-  este similar tipului LON', dar datelenu mai sunt interpretate de PL/SQL.

$ipurile &#MES&$MP , &#MES&$MP -#&+ &#ME ONE , &#MES&$MP 

-#&+ LO"$L &#ME ONE ,  #N&E*$L (E$ &O MON&+ ,  #N&E*$L !$( 

&O SE"ON! au fost introduse în Oracle9i 'i permit rafinări ale tipului !$&E .e e*emplu, &#MES&$MP  poate lua în considerare 'i fracţiuni de secundă.

 PL/SQL suportă două seturi de caractere: una specifică bazei de date careeste utilizată pentru definirea identificatorilor 'i a codului sursă (database

character   set 2 !"S  'i o mulţime de caractere naţionale care este folosită pentrureprezentarea informaţiei cu caracter naţional (national character set 2 N"S .

$ipurile de date N"+$ 'i N*$"+$, sunt utilizate pentru stocarea în baza de date a 'irurilor de caractere ce folosesc  N"S . /le oferă suport pentruglobalizarea datelor, astfel încât utilizatorii din toată lumea pot interacţiona cuOracle în limba lor naţională. ceste tipuri de date suportă numai date Unicode.

Unicode  este o mulţime de caractere globale care permite stocarea deinformaţie în orice limbă, folosind o mulţime unică de caractere.

4

Page 5: Baze de date c2_colectii

7/23/2019 Baze de date c2_colectii

http://slidepdf.com/reader/full/baze-de-date-c2colectii 5/26

)rin urmare, nicode furnizează o valoare cod unică pentru fiecarecaracter, indiferent de platformă, program sau limbă.

Variabile nespecifice PL/SQL

Variabila de legătură (bind  se declară într-un mediu gazdă 'i este folosită pentru transferul (la e*ecuţie valorilor numerice sau de tip caracter în=din unulsau mai multe programe PL/SQL. Variabilele declarate în mediul gazdă sau încel apelant pot fi referite în instrucţiuni PL/SQL, dacă acestea nu sunt în cadrulunei proceduri, funcţii sau pac%et.

n SQL6Pls, variabilele de legătură se declară folosind comanda*$#$BLE , iar pentru afi'area valorilor acestora se utilizează comanda  P#N& ./le sunt referite prin prefi*area cu simbolul >:?, pentru a putea fi deosebite de

variabilele declarate în PL/SQL.eoarece instrucţiunile SQL pot fi integrate în programe " , este necesar 

un mecanism pentru a transfera valori între mediul de programare "   'iinstrucţiunile SQL  care comunică cu  server -ul bazei de date Oracle. n acestscop, în programul încapsulat sunt definite variabilele gazdă (host . cestea suntdeclarate între directivele  BE'#N !E"L$E SE"&#ON   'i  EN! !E"L$E SE"&#ON  ale preprocesorului.

8 valoare nll  în baza de date nu are o valoare corespunzătoare în mediullimbaului gazdă (de e*emplu, limbaul " . )entru a rezolva problema

comunicării valorilor nll   între programul scris în limba gazdă 'i sistemulOracle, au fost definite variabilele indicator. cestea sunt variabile speciale detip întreg, folosite pentru a indica dacă o valoare nll  este recuperată (e*trasădin baza de date sau stocată în aceasta. /le au următoarea formă:

:n5e)e7tern @: indicator A

e e*emplu, dacă atribuirea este făcută de limbaul gazdă, valoarea 70 aindicatorului specifică faptul că  PL/SQL trebuie să înlocuiască valoareavariabilei prin nll , iar o valoare a indicatorului mai mare ca zero precizează că

 PL/SQL trebuie să considere c%iar valoarea variabilei.

Declararea variabilelorBdentificatorii  PL/SQL  trebuie declaraţi înainte de a fi referiţi în blocul

 PL/SQL. acă în declaraţia unei variabile apar referiri la alte variabile, acesteatrebuie să fi fost declarate anterior. 8rice variabilă declarată într-un bloc esteaccesibilă blocurilor conţinute sintactic în acesta.

$ipurile scalare sunt predefinite în pac%etul S&$N!$!. )entru a folosiun astfel de tip într-un program este suficient să fie declarată o variabilă de tipulrespectiv.

$ipurile compuse sunt definite de utilizator. )rin urmare, în acest caztrebuie definit efectiv tipul 'i apoi declarată variabila de tipul respectiv.

#

Page 6: Baze de date c2_colectii

7/23/2019 Baze de date c2_colectii

http://slidepdf.com/reader/full/baze-de-date-c2colectii 6/26

n declararea variabilelor pot fi utilizate atributele 8&(PE   'i8O-&(PE , care reprezintă tipuri de date implicite. ceste tipuri permit

declararea unei variabile în concordanţă cu declaraţii de variabile făcute anterior.tributul 8&(PE   permite definirea unei variabile având tipul uneivariabile declarate anterior sau tipul unei coloane dintr-un tabel.

tributul 8O-&(PE  permite definirea unei variabile având tipul uneiînregistrări dintr-un tabel. vantaul utilizării acestui atribut constă în faptul cănu este necesar să se cunoască numărul 'i tipurile coloanelor tabelului./lementele individuale ale acestei structuri de tip înregistrare sunt referite înmaniera clasică, prefi*ând numele coloanei cu numele variabilei declarate.

<alitatea atributelor 8&(PE  'i 8O-&(PE  constă în faptul că simplifică

întreţinerea codului PL/SQL. e e*emplu, poate fi modificată dimensiunea uneicoloane, fără să fie necesară modificarea declaraţiei variabilelor al căror tip s-adefinit făcând referinţă la tipul coloanei respective.

"inta*a declarării unei variabile este următoarea:

identi0icator @CONSTANT A Cti3)de)date identi0icator %TYPE  identi0icator %ROWTYPE D @ NOT NULLA@ C::  DEFAULT D e73resie)PL/SQLA&

"e pot defini constante (valoarea stocată nu poate fi modificată prin

specificarea la declarare a cuvântului c%eie "ONS&$N& . Exemplu:

v_valoare NUMBER(15) NOT NULL := 0;v_data_achizitie !TE E"!ULT #$#!TE;v_%aterial &!R'!R(15) := *Mata+e*;c_valoare 'ON#T!NT NUMBER := 100000;v_+tare &!R'!R(0) E"!ULT *B,-a*;v_cla+i.icare BOOLE!N E"!ULT "!L#E;

v_cod_o/era o/eracod_o/era%T$E;

v_o/era o/era%RO2T$E;

i-t_a-_l,-a 3NTER&!L $E!R TO MONT :=3NTER&!L *4* $E!R TO MONT;

Observa!! :0. )entru a denumi o variabilă este utilizată frecvent (pentru u'urinţa referirii

 prefi*area cu litera v  (v)identi0icator , iar pentru o constantă este folosită prefi*area cu litera c (c)identi0icator .

+. Variabilele pot fi iniţializate, iar dacă o variabilă nu este iniţializată, valoareaimplicită a acesteia este nll . acă o variabilă este declarată  NO& NULL,atunci ea va fi obligatoriu iniţializată.

6. )entru a iniţializa o variabilă sau o constantă poate fi utilizată o e*presie PL/SQL compatibilă ca tip cu variabila sau constanta respectivă.

;

Page 7: Baze de date c2_colectii

7/23/2019 Baze de date c2_colectii

http://slidepdf.com/reader/full/baze-de-date-c2colectii 7/26

4. <onstantele trebuie iniţializate când sunt declarate, altfel apare o eroare lacompilare.

#. n secţiunea declarativă, pe fiecare linie, e*istă o singură declaraţie devariabilă.

;. ouă obiecte (variabile pot avea acela'i nume cu condiţia să fie definite în blocuri diferite. acă ele coe*istă, poate fi folosit doar obiectul declarat în blocul curent.

5. tributul 8O-&(PE nu poate include clauze de iniţializare.

Definirea subtipurilor"ubtipurile derivă dintr-un tip de bază, la care se adaugă anumite restricţii.

e e*emplu,  N$&U$L

 este un subtip predefinit PL/SQL

, derivat din tipul de bază  B#N$()#N&E'E, cu restricţia că permite prelucrarea valorilor întreginenegative.

)rin urmare, un subtip nu reprezintă un nou tip de date, ci un tip e*istentasupra căruia se aplică anumite constrângeri. "ubtipurile presupun acela'i set deoperaţii ca 'i tipul de bază, dar aplicate unui subset de valori al acestui tip.

"istemul Oracle  permite ca utilizatorul să-'i definească propriile saletipuri 'i subtipuri de date în partea declarativă a unui bloc PL/SQL, subprogramsau pac%et utilizând sinta*a:

 SUBTYPE  n5e)sbti3 "S  ti3)de)baa @ NOT NULLA&n dicţionarul datelor  e*istă vizualizări care furnizează informaţii despre

tipurile de date create de utilizator (USE)&(PES , USE)&(PE)$&&S .

Conversii între tipuri de date

/*istă două tipuri de conversii:implicite&e*plicite.

 PL/SQL  face automat conversii implicite între caractere 'i numere sauîntre caractere 'i date calendaristice. <%iar dacă sistemul realizează automataceste conversii, în practică se utilizează frecvent funcţii de conversie e*plicită.

Funcţiile de conversie e*plicită din SQL  sunt utilizabile 'i în  PL/SQL. $cestea sunt: &O)NUMBE,  &O)"+$,  &O)!$&E ,  &O)MUL&#)B(&E ,&O)S#N'LE)B(&E ,  "+$&OO-#!,  O-#!&O"+$,  $-&O+E1 ,

 +E1&O$-< &O)"LOB, &O)LOB.

n Oracle9i  se pot folosi următoarele funcţii de conversie:  $S"##S&, B#N)&O)NUM ,  NUM&O!S#N&E*$L,  &O)&#MES&$MP ,  &O)(M#N&E*$L,&O)N"+$,  &O)N"LOB,  &O)&#MES&$MP)& ,  NUM&O(M#N&E*$L,&O)!S#N&E*$L,  E%&O+E1 ,  $-&O+E1 ,  $-&ON+E1 ,  %OM)& ,

 O-#!&ON"+$, "OMPOSE , !E"OMPOSE .

5

Page 8: Baze de date c2_colectii

7/23/2019 Baze de date c2_colectii

http://slidepdf.com/reader/full/baze-de-date-c2colectii 8/26

enumirile acestor funcţii reflectă posibilităţile pe care le oferă. ee*emplu, &O)(M#N&E*$L converte'te argumentele sale la tipul  #N&E*$L(E$ &O MON&+   conform unui format specificat. Funcţia "OMPOSE 

converte'te un 'ir de caractere la un 'ir nicode (asociază o valoare cod unică pentru fiecare simbol din 'ir.

Înregistrări$ipul  E"O!  oferă un mecanism pentru prelucrarea înregistrărilor.

nregistrările au mai multe câmpuri ce pot fi de tipuri diferite, dar care suntlegate din punct de vedere logic.

Bnregistrările trebuie definite în doi pa'i:

• se define'te tipul E"O!&

• se declară înregistrările de acest tip.

eclararea tipului E"O! se face conform următoarei sinta*e:

TYPE  n5e)ti3  "S RECORD(n5e)c=53> Cti3)c=53 variabil?%TYPE    n5e)tabel .coloan?%TYPE   n5e)tabel %ROWTYPE D  @ @ NOT NULLA C::  DEFAULT D e73resie>A,(n5e)c=53, Cti3)c=53 variabil?%TYPE    n5e)tabel .coloan?%TYPE   n5e)tabel %ROWTYPE D

  @ @ NOT NULLA C::  DEFAULT D e73resie,A,@&Bdentificatorul n5e)ti3  reprezintă numele tipului  E"O!  care se va

specifica în declararea înregistrărilor, n5e)c=53 este numele unui câmp alînregistrării, iar ti3)c=53 este tipul de date al câmpului.

Observa!! :• acă un câmp nu este iniţializat atunci implicit se consideră că are

valoarea  NULL. acă s-a specificat constrângerea  NO& NULL, atunciobligatoriu câmpul trebuie iniţializat cu o valoare diferită de NULL.

• )entru referirea câmpurilor individuale din înregistrare se prefi*ează

numele câmpului cu numele înregistrării.• )ot fi asignate valori unei înregistrări utilizând comenzile SELE"& ,

 %E&"+  sau instrucţiunea clasică de atribuire. e asemenea, o înregistrare poate fi asignată altei înregistrari de acela'i tip.

• <omponentele unei înregistrări pot fi de tip scalar,  E"O!<  &$BLE<obiect, colecţie (dar, nu tipul E% "USO.

•  PL/SQL permite declararea 'i referirea înregistrărilor imbricate.

•  !umărul de câmpuri ale unei înregistrări nu este limitat.

• nregistrările nu pot fi comparate (egalitate, inegalitate sau nll .

3

Page 9: Baze de date c2_colectii

7/23/2019 Baze de date c2_colectii

http://slidepdf.com/reader/full/baze-de-date-c2colectii 9/26

• nregistrările pot fi parametri în subprograme 'i pot să apară în clauza E&UN a unei funcţii.

iferenţa dintre atributul 8O-&(PE  'i tipul de date compus E"O!A• tipul E"O!  permite specificarea tipului de date pentru câmpuri 'i

 permite declararea câmpurilor sale&

• atributul 8O-&(PE   nu cere cunoa'terea numărului 'i tipurilor coloanelor tabloului.

Oracle9i introduce câteva facilităţi legate de acest tip de date.

• "e poate insera ( #NSE&  o linie într-un tabel utilizând o înregistrare. !u mai este necesară listarea câmpurilor individuale, ci este suficientăutilizarea numelui înregistrării.

• "e poate reactualiza (UP!$&E  o linie a unui tabel utilizând oînregistrare. "inta*a SE& O-  permite să se reactualizeze întreagalinie folosind conţinutul unei înregistrări.

• ntr-o înregistrare se poate regăsi 'i returna sau 'terge informaţia dinclauza E&UN#N' a comenzilor UP!$&E  sau !ELE&E .

• acă în comenzile UP!$&E sau !ELE&E  se modifică mai multe linii,atunci pot fi utilizate în sinta*a BUL "OLLE"& #N&O, colecţii deînregistrări.

 Exemplu:/*emplul următor arată modul în care poate să fie utilizată o înregistrare

în clauza E&UN#N' asociată comenzii !ELE&E .E'L!RE  T$E val_o/era 3# RE'OR (  cheie NUMBER6  val NUMBER);  v_i-.o_valoare val_o/era;BE73N  ELETE "ROM o/era  2ERE cod_o/era = 854  RETURN3N7 cod_o/era6 valoare  3NTO v_i-.o_valoare;  9EN;

ColecţiiEneori este preferabil să fie prelucrate simultan mai multe variabile de

acela'i tip. $ipurile de date care permit acest lucru sunt colecţiile. Fiecareelement are un indice unic, care determină poziţia sa în colecţie.

OracleC  a furnizat tipul inde72b4 table, iniţial numit PL/SQL table datorităasemănării sale cu structura tabelelor relaţionale.

2

Page 10: Baze de date c2_colectii

7/23/2019 Baze de date c2_colectii

http://slidepdf.com/reader/full/baze-de-date-c2colectii 10/26

OracleD a introdus două tipuri colecţie, nested table 'i varra4. Oracle9i permite crearea de colecţii pe mai multe niveluri, adică colecţii de colecţii.

n PL/SQL e*istă trei tipuri de colecţii:• tablouri inde*ate (inde72b4 tables&

• tablouri imbricate (nested tables&• vectori (varra4s sau var4ing arra4s.

$ipul inde72b4 table poate fi utilizat numai în declaraţii PL=SQL. $ipurilevarra4 'i nested table pot fi utilizate atât în declaraţii PL=SQL, cât 'i în declaraţiila nivelul sc%emei (de e*emplu, pentru definirea tipului unei coloane a unuitabel relaţional.

 Exemplu:n e*emplul care urmează sunt ilustrate cele trei tipuri de colecţii.

E'L!RET$E ta_i-de 3# T!BLE O" NUMBER

  3NE< B$ B3N!R$_3NTE7ER;  T$E ta_i%ri 3# T!BLE O" NUMBER;  T$E vector 3# &!RR!$(15) O" NUMBER;  v_ta_i-de ta_i-de;  v_ta_i%ri ta_i%ri;  v_vector vector;BE73N  v_ta_i-de(1) := 8;  v_ta_i-de() := 4;  v_ta_i%ri := ta_i%ri(56 46 6 6 8);  v_vector := vector(16 );EN;

Observa!! :

• eoarece colecţiile nu pot fi comparate (egalitate sau inegalitate, elenu pot să apară în clauzele !#S&#N"& , 'OUP B( , O!E B( .

• $ipul colecţie poate fi definit într-un pac%et.

• $ipul colecţie poate să apară în clauza E&UN a unei funcţii.

• <olecţiile pot fi parametri formali într-un subprogram.

• ccesul la elementele individuale ale unei colecţii se face prinutilizarea unui indice.

Tablouri indexate$ipul de date inde72b4 table  oferă un mecanism pentru prelucrarea

tablourilor. $abloul inde*at  PL/SQL  are două componente: o coloană ce

cuprinde c%eia primară pentru acces la liniile tabloului 'i o coloană care includevaloarea efectivă a elementelor tabloului.

01

Page 11: Baze de date c2_colectii

7/23/2019 Baze de date c2_colectii

http://slidepdf.com/reader/full/baze-de-date-c2colectii 11/26

OracleC asigură definirea tablourilor de înregistrări care pot fi declarate 'iutilizate numai în programe PL/SQL, OracleD realizează definirea tablourilor detipuri obiect, iar Oracle9i permite definirea tablourilor de colecţii.

n Oracle9i  tipul inde72b4 table este redenumit associative arra4  pentrucompatibilitate (de limba cu termenul folosit în alte limbae de programare (" , avaScri3t , Perl  pentru a defini această structură de date.

$ablourile inde*ate PL/SQL trebuie definite în doi pa'i: se define'te tipul&$BLE & se declară tabloul inde*at PL/SQL de acest tip.

eclararea tipului &$BLE se face respectând următoarea sinta*ă:

TYPE  n5e)ti3  "S TABLE OF  Cti3)coloan? variabil?%TYPE  n5e)tabel .coloan?%TYPE  @ NOT NULLA n5e)tabel %ROWTYPE D 

 "NDE# BY ti3)inde7are&

Bdentificatorul n5e)ti3 este numele noului tip definit care va fi specificatîn declararea tabloului  PL/SQL, iar ti3)coloan?  este un tip scalar simplu (dee*emplu, *$"+$,, "+$, !$&E  sau NUMBE.

)ână la versiunea Oracle9i unicul tip de inde*are acceptat era #N!E1 B( 

 B#N$()#N&E'E. Oracle9i permite următoarele opţiuni pentru ti3)inde7are: PLS)#N&E'E,  N$&U$L,  POS#&#*E ,  *$"+$,(n sau c%iar inde*areadupă un tip declarat cu 8&(PE . !u sunt permise inde*ările  #N!E1 B( 

 NUMBE,  #N!E1 B( #N&E'E,  #N!E1 B( !$&E ,  #N!E1 B( *$"+$,, #N!E1 B(   "+$(n sau inde*area după un tip declarat cu 8&(PE   în careintervine unul dintre tipurile enumerate anterior.

Observa!! :

• /lementele unui tablou inde*at nu sunt într-o ordine particulară 'i potfi inserate cu c%ei arbitrare.

• eoarece nu e*istă constrângeri de dimensiune, dimensiunea tablouluise modifică dinamic.

• $abloul inde*at PL/SQL nu poate fi iniţializat în declararea sa.

• En tablou inde*at neiniţializat este vid (nu conţine nici valori, nicic%ei.

• En element al tabloului este nedefinit atâta timp cât nu are atribuită ovaloare efectivă.

• Bniţial, un tablou inde*at este nedens. upă declararea unui tablou se poate face referire la liniile lui prin precizarea valorii c%eii primare.

00

Page 12: Baze de date c2_colectii

7/23/2019 Baze de date c2_colectii

http://slidepdf.com/reader/full/baze-de-date-c2colectii 12/26

• acă se face referire la o linie care nu e*istă, atunci se producee*cepţia NO)!$&$)%OUN!.

• acă se dore'te contorizarea numărului de linii, trebuie declarată ovariabilă în acest scop sau poate fi utilizată o metodă asociatătabloului.

• eoarece numărul de linii nu este limitat, operaţia de adăugare de liniieste restricţionată doar de dimensiunea memoriei alocate.

• $ablourile pot să apară ca argumente într-o procedură.

)entru inserarea unor valori din tablourile PL/SQL într-o coloană a unuitabel de date se utilizează instrucţiunea  #NSE&   în cadrul unei secvenţerepetitive LOOP .

semănător, pentru regăsirea unor valori dintr-o coloană a unei baze dedate într-un tablou  PL/SQL  se utilizează instrucţiunea  %E&"+   (cursoare sauinstrucţiunea de atribuire în cadrul unei secvenţe repetitive LOOP .

)entru a 'terge liniile unui tablou fie se asignează elementelor tablouluivaloarea nll , fie se declară un alt tablou PL/SQL (de acela'i tip care nu esteiniţializat 'i acest tablou vid se asignează tabloului  PL/SQL care trebuie 'ters. n

 PL/SQL +.6 'tergerea liniilor unui tabel se poate face utilizând metoda !ELE&E .

 Exemplu:"ă se definească un tablou inde*at  PL/SQL  având elemente de tipul

 NUMBE. "ă se introducă +1 de elemente în acest tablou. "ă se 'teargă tabloul.E'L!RET$E talo,_-,%ar 3# T!BLE O" NUMBER

  3NE< B$ L#_3NTE7ER;  v_talo, talo,_-,%ar;BE73N  "OR i 3N 10 LOO  v_talo,(i) := i>i;

BM#_OUTUTUT_L3NE(v_talo,(i));  EN LOO;  v_talo, := NULL;  acea+ta atri,ire da eroarea L#004  "OR i 3N v_talo,"3R#Tv_talo,L!#T LOO  v_talo,(i) := NULL;EN LOO;

  BM#_OUTUTUT_L3NE(*talo,l are * ?? v_talo,'OUNT ??  * ele%e-te*);EN;

n PL/SQL este folosit frecvent tipul tablou de înregistrări. 9eferirea la unelement al tabloului se face prin forma clasică: tabel (inde7.c=53.

 Exemplu:

0+

Page 13: Baze de date c2_colectii

7/23/2019 Baze de date c2_colectii

http://slidepdf.com/reader/full/baze-de-date-c2colectii 13/26

"ă se definească un tablou de înregistrări având tipul celor din tabelulorganiator . "ă se iniţializeze un element al tabloului 'i să se introducă întabelul organiator . "ă se 'teargă elementele tabloului.

E'L!RE  T$E or@_tale_tA/e 3# T!BLE O" or@a-izatorRO2T$E  3NE< B$ B3N!R$ 3NTE7ER;  or@_tale or@_tale_tA/e;  i NUMBER;BE73N  3" or@_tale'OUNT CD0 TEN  i := or@_taleL!#T1;  EL#E i:=1;

  EN 3";  or@_tale(i)cod_or@ := 85;  or@_tale(i)-,%e := *7ri@ore 3o-*;  or@_tale(i)adre+a := *'alea lev-ei 1 #ii,*;  or@_tale(i)ti/ := */er+oa-a .izica*;  3N#ERT 3NTO or@a-izator  &!LUE# (or@_tale(i)cod_or@6 or@_tale(i)-,%e6  or@_tale(i)adre+a6 or@_tale(i)ti/);  +a, .olo+i-d -o,a .acilitate OracleFi  3N#ERT 3NTO or@a-izator

  &!LUE# (or@_tale(i));  or@_taleELETE; +ter@e toate ele%e-tele  BM#_OUTUTUT_L3NE(*,/a a/licarea %etodei ELETE  +,-t *??TO_'!R(or@_tale'OUNT)??* ele%e-te*);EN;

VectoriVectorii (varra4 sunt structuri asemănătoare vectorilor din limbaele " 

sau  ava. "pre deosebire de tablourile inde*ate, vectorii au o dimensiunema*imă (constantă stabilită la declarare. n special, se utilizează pentrumodelarea relaţiilor one2to25an4, atunci când numărul ma*im de elemente din

 partea >5an4? este cunoscut 'i ordinea elementelor este importantă.

Vectorii reprezintă structuri dense. Fiecare element are un inde* care dă poziţia sa în vector 'i care este folosit pentru accesarea elementelor particulare.imita inferioară a indicelui este 0. Vectorul poate conţine un număr variabil deelemente, de la 1 (vid la numărul ma*im specificat obligatoriu în definiţia sa.

$ipul de date vector este declarat utilizând sinta*a:

TYPE  n5e)ti3 "S  C$ARRAY  G $ARY"N ARRAY D (lngi5e)5a7i5?OF  ti3)ele5ente @ NOT NULLA&

06

Page 14: Baze de date c2_colectii

7/23/2019 Baze de date c2_colectii

http://slidepdf.com/reader/full/baze-de-date-c2colectii 14/26

Bdentificatorul n5e)ti3 este numele tipului de date vector, iar lngi5e)5a7i5?  reprezintă numărul ma*im de elemente din vector.&i3)ele5ente  este un tip scalar  PL/SQL, tip înregistrare sau tip obiect. e

asemenea, acest tip poate fi definit utilizând atributele 8&(PE   sau8O-&(PE .

n Oracle9i sunt permise (pentru ti3)ele5ente tipurile &$BLE sau alt tip*$$( . /*istă restricţii referitoare la tipul elementelor, în sensul că acesta nu

 poate să fie  BOOLE$N ,  N"+$,  N"LOB,  N*$"+$,,  E% "USO, PLS)#N&E'E,  LON',  LON' $- ,  N$&U$L,  N$&U$LN ,  POS#&#*E , POS#&#*EN ,  B#N$()#N&E'E,  S#'N&(PE ,  S&#N',  tip obiect cu atribute&$BLE sau *$$( , BLOB, "LOB, tip obiect cu atribute BLOB sau "LOB.

 Exemplu:

E'L!RE  T$E +ecve-ta 3# &!RR!$(5) O" &!R'!R(10);  v_+ec +ecve-ta := +ecve-ta (*al*6 *-e@r,*6 *ro+,*6

*verde*);BE73N  v_+ec (4) := *ro+,*;  v_+ecE<TEN; ada,@a ,- ele%e-t -,ll  v_+ec(5) := *ala+tr,*;  eti-derea la G ele%e-te va @e-era eroarea OR!0G54  v_+ecE<TEN;

EN;Tablouri imbricate

$ablourile imbricate (nested table sunt tablouri inde*ate a căror dimensiune nu este stabilită. !umărul ma*im de linii ale unui tablou imbricateste dat de capacitatea ma*imă + 'B.

En tablou imbricat este o mulţime neordonată de elemente de acela'i tip.Valorile de acest tip:

-- pot fi stocate în baza de date,-- pot fi prelucrate direct în instrucţiuni SQL 

-- au e*cepţii predefinite proprii."istemul Oracle nu stoc%ează liniile unui tablou imbricat într-o ordine particulară. ar, când se regăse'te tabloul în variabile  PL/SQL, liniile vor aveaindici consecutivi începând cu valoarea 0. Bniţial, aceste tablouri sunt structuridense, dar se poate ca în urma prelucrării să nu mai aibă indici consecutivi.

<omanda de declarare a tipului de date tablou imbricat are sinta*a:

TYPE  n5e)ti3 "S TABLE OF  ti3) ele5ente @ NOT NULLA&

Bdentificatorul  n5e)ti3 reprezintă numele noului tip de date tablouimbricat, iar ti3)ele5ente este tipul fiecărui element din tabloul imbricat, care

 poate fi un tip definit de utilizator sau o e*presie cu 8&(PE , respectiv8O-&(PE .

04

Page 15: Baze de date c2_colectii

7/23/2019 Baze de date c2_colectii

http://slidepdf.com/reader/full/baze-de-date-c2colectii 15/26

n Oracle9i sunt permise (pentru ti3)ele5ente tipurile &$BLE sau alt tip*$$( . /*istă restricţii referitoare la tipul elementelor, în sensul că acesta nu

 poate să fie  BOOLE$N ,  S&#N'< N"+$,  N"LOB,  N*$"+$,,  E% 

"USO,  B#N$()#N&E'E,  PLS)#N&E'E,  LON',  LON' $- , N$&U$L,  N$&U$LN ,  POS#&#*E ,  POS#&#*EN ,  S#'N&(PE ,  tip obiect cuatributele &$BLE sau *$$(.

$abloul imbricat are o singură coloană, iar dacă aceasta este de tip obiect,tabloul poate fi vizualizat ca un tabel multicoloană, având câte o coloană pentrufiecare atribut al tipului obiect.

 Exemplu:

E'L!RE

  T$E -,%arta 3# T!BLE O" NUMBER;  +e creeaza ,- talo, c, ,- +i-@,r ele%e-t  v_ta_1 -,%arta := -,%arta(8);  +e creeaza ,- talo, c, H ele%e-te  v_ta_ -,%arta := -,%arta(86F6H65);  +e creeaza ,- talo, .ara -ici ,- ele%e-t  v_ta_4 -,%arta := -,%arta();BE73N  v_ta_1(1) := 58;  "OR I 3N 1H LOO

  BM#_OUTUTUT_L3NE (v_ta_(I) ?? * *);  EN LOO;EN;

"e observă că singura diferenţă sintactică între tablourile inde*ate 'i celeimbricate este absenţa clauzei #N!E1 B( B#N$()#N&E'E. Hai e*act, dacăaceastă clauză lipse'te, tipul este tablou imbricat.

Observa!! :

• "pre deosebire de tablourile inde*ate, vectorii 'i tablourile imbricate pot să apară în definirea tabelelor bazei de date.

• $ablourile inde*ate pot avea indice negativ, domeniul permis pentruinde* fiind 7+045436;45..+045436;45, iar pentru tabele imbricatedomeniul inde*ului este 0..+045436;45.

• $ablourile imbricate, spre deosebire de tablourile inde*ate, pot fi prelucrate prin comenzi SQL.

• $ablourile imbricate trebuie iniţializate 'i=sau e*tinse pentru a li seadăuga elemente.

<ând este creat un tablou inde*at care nu are încă elemente, el este vid.acă un tablou imbricat (sau un vector este declarat, dar nu are încă nici un

0#

Page 16: Baze de date c2_colectii

7/23/2019 Baze de date c2_colectii

http://slidepdf.com/reader/full/baze-de-date-c2colectii 16/26

element (nu este iniţializat, el este automat iniţializat (atomic nll . dică,colecţia este nll , nu elementele sale. )rin urmare, pentru tablouri imbricate

 poate fi utilizat operatorul  #S NULL. acă se încearcă să se adauge un elementla un tablou imbricat nll , se va genera eroarea >O$ 2 FGHI>A re0erence to

ninitialied collection? care corespunde e*cepţiei predefinite"OLLE"&#ON)#S)NULL.

)rin urmare, cum poate fi iniţializat un tablou imbricatI <a 'i obiectele,vectorii 'i tablourile imbricate sunt iniţializate cu autorul constructorului.cesta are acela'i nume ca 'i tipul colecţiei referite.  PL/SQL  apelează unconstructor numai în mod e*plicit. $abelele inde*ate nu au constructori.

<onstructorul prime'te ca argumente o listă de valori de tip ti3)ele5ente./lementele sunt numerotate în ordine, de la 0 la numărul de valori date ca

 parametrii constructorului. imensiunea iniţială a colecţiei este egală cunumărul de argumente date în constructor, când aceasta este iniţializată. )entruvectori nu poate fi depă'ită dimensiunea ma*imă precizată la declarare. tuncicând constructorul este fără argumente, va crea o colectie fără nici un element(vida, dar care are valoarea not  nll . /*emplul următor este concludent în acestsens.

 Exemplu:

E'L!RE  T$E al.a 3# T!BLE O" &!R'!R(50);  creeaza ,- talo, (ato%ic) -,ll  ta1 al.a ;  J> creeaza ,- talo, c, ,- ele%e-t care e+te -,ll6 dar  talo,l -, e+te -,ll6 el e+te i-itializat6 /oate  /ri%i ele%e-te >J  ta al.a := al.a() ;BE73N

  3" ta1 3# NULL TEN  BM#_OUTUTUT_L3NE(*ta1 e+te NULL*);  EL#E  BM#_OUTUTUT_L3NE(*ta1 e+te NOT NULL*);  EN 3";  3" ta 3# NULL TEN  BM#_OUTUTUT_L3NE(*ta e+te NULL*);  EL#E  BM#_OUTUTUT_L3NE(*ta e+te NOT NULL*);

  EN 3";EN;

0;

Page 17: Baze de date c2_colectii

7/23/2019 Baze de date c2_colectii

http://slidepdf.com/reader/full/baze-de-date-c2colectii 17/26

n urma e*ecuţiei acestui bloc se obţine următorul rezultat:

ta1 e+te NULL

ta e+te NOT NULL/*cepţiile semnificative care apar în cazul utilizării incorecte a colecţiilor:

 Exemplu&

E'L!RE  T$E -,%ar 3# T!BLE O" 3NTE7ER;  al.a -,%ar;BE73N  al.a(1) := 88;  decla-+eaza ece/tia 'OLLE'T3ON_3#_NULL  al.a := -,%ar(156 G6 48);  al.a(1) := !#'33(*<*);  al.a() := 10>al.a(1);  al.a(**) := 88;  J> decla-+eaza ece/tia &!LUE_ERROR deoarece i-dicele  -, e+te co-vertiil la i-tre@ >J  al.a(H) := H8;  J> decla-+eaza ece/tia #UB#'R3T_BE$ON_'OUNT deoarece  i-dicele +e re.era la ,- ele%e-t -ei-itializat >J

  al.a(-,ll) := 8; decla-+eaza ece/tia &!LUE_ERROR  al.a(0) := 8; ece/tia #UB#'R3T_OUT#3E_L3M3T  al.aELETE(1);  3" al.a(1) = 1 TEN 9 ece/tia NO_!T!_"OUN  9

EN;

$ablourile imbricate 'i vectorii pot fi utilizaţi drept câmpuri în tabelele bazei. ceasta presupune că fiecare înregistrare din tabelul respectiv conţine unobiect de tip colecţie. nainte de utilizare, tipul trebuie stocat în dicţionarul

datelor, deci trebuie declarat prin comanda:CREATE TYPE  n5e)ti3 AS  CTABLE  G $ARRAY D OF  ti3)ele5ente&

upă crearea tabelului (prin comanda "E$&E &$BLE , pentru fiecarecâmp de tip tablou imbricat din tabel este necesară clauza de stocare:

 NESTED TABLE  n5e)c=53 STORE AS  n5e)tabel &

Colecţii pe mai multe niveluri

n Oracle9i  se pot construi colecţii pe mai multe niveluri (5ltilevel 

collections, prin urmare colecţii ale căror elemente sunt, în mod direct sauindirect, colecţii. n felul acesta pot fi definite structuri comple*e: vectori de

05

Page 18: Baze de date c2_colectii

7/23/2019 Baze de date c2_colectii

http://slidepdf.com/reader/full/baze-de-date-c2colectii 18/26

vectori, vectori de tablouri imbricate, tablou imbricat de vectori, tablou imbricatde tablouri imbricate, tablou imbricat sau vector de un tip definit de utilizator 

care are un atribut de tip tablou imbricat sau vector.ceste structuri comple*e pot fi utilizate ca tipuri de date pentru definirea:

• coloanelor unui tabel relaţional,

• atributelor unui obiect într-un tabel obiect,

• variabilelor PL/SQL.

Observa!!&

•  !umărul nivelurilor de imbricare este limitat doar de capacitatea destocare a sistemului.

• )entru a accesa un element al colecţiei incluse sunt utilizate douăseturi de paranteze.

• 8biectele de tipul colecţie pe mai multe niveluri nu pot fi comparate.

 Exemplu:n e*emplele care urmează sunt definite trei structuri comple*e 'i sunt

 prezentate câteva modalităţi de utilizare ale acestora. /*emplele se referă lavectori pe mai multe niveluri, tablouri imbricate pe mai multe niveluri 'i tablouriinde*ate pe mai multe niveluri.

E'L!RET$E al.a 3# &!RR!$(10) O" 3NTE7ER;

  T$E eta 3# &!RR!$(10) O" al.a;  val. al.a := al.a(164165); i-itializare  vet eta := eta(val.6al.a(556G688)6al.a(6H)6val.);  i i-te@er;  var1 al.a;BE73N  i := vet()(4); i va l,a valoarea 88

  vetE<TEN; +e ada,@a ,- ele%e-t de ti/ vector la vet  vet(5) := al.a(5G644);  vet(H) := al.a(HH6GG6886H41);  vet(H)(H) := 8; H41 e+te i-loc,it c, 8  vet(H)E<TEN; +e ada,@a ,- ele%e-t la al Hlea ele%e-t

  vet(H)(5) := 888; ace+t -o, ele%e-t ada,@at va .i 888

EN;

JE'L!RE  T$E @a%a 3# T!BLE O" &!R'!R(0);

  T$E delta 3# T!BLE O" @a%a;  T$E teta 3# &!RR!$(10) O" 3NTE7ER;

03

Page 19: Baze de date c2_colectii

7/23/2019 Baze de date c2_colectii

http://slidepdf.com/reader/full/baze-de-date-c2colectii 19/26

  T$E e/+i 3# T!BLE O" teta;var1 @a%a := @a%a(*al*6*-e@r,*);

  var delta := delta(var1);

  var4 e/+i := e/+i(teta(41615)6teta(16465));BE73N  varE<TEN;  var() := var(1);  varELETE(1); +ter@e /ri%,l ele%e-t di- var  J> +ter@e /ri%,l +ir de caractere di- al doilea

talo, al talo,l,i i%ricat >J  var()ELETE(1);EN;

JE'L!RET$E al.a 3# T!BLE O" 3NTE7ER 3NE< B$ B3N!R$_3NTE7ER;

  T$E eta 3# T!BLE O" al.a 3NE< B$ B3N!R$_3NTE7ER;  T$E @a%a 3# &!RR!$(10) O" &!R'!R(40);  T$E delt 3# T!BLE O" @a%a 3NE< B$ B3N!R$_3NTE7ER;  var1 @a%a := @a%a(*al*6*-e@r,*);  var eta;  var4 delt;  varH al.a;  var5 al.a; talo, vidBE73N  varH(1) := 4H;  varH() := ;  varH(H) := 444;  var(8) := varH;  var4(4F) := @a%a(8868G6F6F0);  var(H0)(4) := 55; eroare -, ei+ta ele%e-t H0 i- var

  var(H0) := var5; a+i@-ez ,- talo, -,ll  var(H0)(4) := 55; corectEN;

J

relucrarea colecţiilor

8 colecţie poate fi e*ploatată fie în întregime (atomic utilizând comenzi LM!, fie pot fi prelucrate elemente individuale dintr-o colecţie ( 3ieceJise3dates utilizând operatori SQL sau anumite facilităţi oferite de PL/SQL.

• <omanda  #NSE&  permite inserarea unei colecţii într-o linie a unuitabel. <olecţia trebuie să fie creată 'i iniţializată anterior.

• <omanda UP!$&E   este folosită pentru modificarea unei colecţiistocate.

02

Page 20: Baze de date c2_colectii

7/23/2019 Baze de date c2_colectii

http://slidepdf.com/reader/full/baze-de-date-c2colectii 20/26

• <omanda !ELE&E  poate 'terge o linie ce conţine o colecţie.

• <olecţiile din baza de date pot fi regăsite în variabile  PL/SQL,

utilizând comanda SELE"& . Exemplu:'RE!TE OR REL!'E T$E o/erali+t !# &!RR!$(10) O"  NUMBER(H);

'RE!TE T!BLE @al_o/e (  cod_@alerie NUMBER(10)6  -,%e_@alerie &!R'!R(0)6  i-.o o/erali+t);

E'L!REv_o/era o/erali+t := o/erali+t (8886 6 FFF);

  v_i-.o_o/ o/erali+t := o/erali+t (8008);  v_i-.o @al_o/ei-.oT$E;  v_cod @al_o/ecod_@alerieT$E := 4H5;BE73N  3N#ERT 3NTO @al_o/e  &!LUE# (H5G86 *3%/re+io-i+ti*6 o/erali+t(H5G86HF8));  3N#ERT 3NTO @al_o/e  &!LUE# (4H56 *',i+%*6 v_o/era);  3N#ERT 3NTO @al_o/e

  &!LUE# (146 *!l.a*6 v_i-.o_o/);  #ELE'T i-.o  3NTO v_i-.o  "ROM @al_o/e  2ERE cod_@alerie = v_cod;

EN;

En vector stocat într-un tabel este prelucrat ca un întreg (nu pot fimodificate elemente individuale. )rin urmare, elementele individuale ale unuivector nu pot fi referite în comenzile #NSE& , UP!$&E   sau !ELE&E . )entru

referirea acestora trebuie utilizate comenzi procedurale  PL/SQL.  )entru amodifica un vector, el trebuie selectat într-o variabilă PL/SQL  a cărei valoare poate fi modificată 'i apoi reinserată în tabel.

$ablourile imbricate depuse în baza de date sunt mai fle*ibile, deoarece pot fi prelucrate fie în întregime, fie ca elemente individuale. n fiecare caz pot fiutilizate numai comenzi SQL.

"e pot face reactualizări sau inserări asupra tablourilor imbricate care dauo valoare nouă pentru întreaga colecţie sau se pot face inserări, 'tergeri,reactualizări de elemente particulare din colecţie.

+1

Page 21: Baze de date c2_colectii

7/23/2019 Baze de date c2_colectii

http://slidepdf.com/reader/full/baze-de-date-c2colectii 21/26

8 colecţie poate fi asignată altei colecţii prin comenzile  #NSE& ,UP!$&E ,  %E&"+ , SELE"& , instrucţiunea de atribuire sau prin apelul unuisubprogram, dar colecţiile trebuie să fie de acela'i tip. acă unei colecţii i seasignează o colecţie atomic nll , aceasta devine atomic nll   'i trebuiereiniţializată.

n OracleDi  a fost introdus operatorul &$BLE , ce permite prelucrareaelementelor unui tablou imbricat care este stocat într!un tabel . 8peratorul

 permite interogarea unei colecţii în clauza %OM  (la fel ca un tabel.8perandul lui &$BLE este:• fie numele unei colecţii 'i atunci rezultatul operatorului este tot o

colecţie,

• fie este o subinterogare referitoare la o colecţie, iar în acest caz,operatorul &$BLE  returnează o singură valoare (coloană care este untablou imbricat sau un vector. )rin urmare, lista din clauza SELE"&  asubcererii trebuie să aibă un singur articol.

 Exemplu:"e presupune că tabelul o3era are o coloană in0o de tip tablou imbricat.

cest tablou are două componente în care pentru fiecare operă de artă suntdepuse numele articolului referitor la opera respectivă 'i revista în care a apărut."ă se insereze o linie în tabelul imbricat.

3N#ERT 3NTO T!BLE (#ELE'T i-.o"ROM o/era

  2ERE titl, = *ri%avara*)&!LUE# (*ict,ra %oder-a*6 *Orizo-t,ri*);

istarea codului fiecărei opere de artă 'i a colecţiei articolelor referitoarela aceste opere de artă se face prin comanda:

#ELE'T acod_o/era6 >"ROM o/era a6 T!BLE (ai-.o) ;

)entru tablouri imbricate pe mai multe niveluri, operaţiile  LM!  pot fifăcute atomic sau pe elemente individuale, iar pentru vectori pe mai multeniveluri, operaţiile pot fi făcute numai atomic.

)entru prelucrarea unei colecţii locale se poate folosi 'i operatorul "$S& ."$S&  are forma sintactică:

CAST (n5e)colecKie AS  ti3)colecKie

8peranzii lui "$S&   sunt o colecţie declarată local (de e*emplu, într-un bloc PL/SQL anonim 'i un tip colecţie SQL. "$S&  converte'te colecţia locală la

+0

Page 22: Baze de date c2_colectii

7/23/2019 Baze de date c2_colectii

http://slidepdf.com/reader/full/baze-de-date-c2colectii 22/26

tipul specificat. n felul acesta, o colecţie poate fi prelucrată ca 'i cum ar fi untabel SQL al bazei de date.

"etodele unei colecţii PL/SQL  oferă subprograme numite metode (5ethods, care operează

asupra unei colecţii. cestea pot fi apelate numai din comenzi procedurale, 'inu din SQL.

Hetodele sunt apelate prin e*presia:

n5e)colecKie.n5e)5etod? @ ( 3ara5etri A

Hetodele care se pot aplica colecţiilor PL/SQL sunt următoarele:

COUNT  returnează numărul curent de elemente ale unei colecţii PL/SQL& DELETE #'$ 'terge elementul n dintr-o colecţie PL/SQL&  !ELE&E (5, n'terge toate elementele având indec'ii între 5  'i n&  !ELE&E   'tergetoate elementele unei colecţii  PL/SQL  (nu este validă pentru tipulvarra4s&

 E#"STS #'$ returnează &UE dacă e*istă al n-lea element al unei colecţii PL/SQL (altfel, returnează %$LSE , c%iar dacă elementul este nll &

F"RST ,  LAST   returnează indicele primului, respectiv ultimului elementdin colecţie&

 NE#T #'$,  PR"OR#'$  returnează indicele elementului următor, respectiv precedent celui de rang n din colecţie, iar dacă nu e*istă un astfel deelement returnează valoarea nll &

 E#TEND adaugă elemente la sfâr'itul unei colecţii: E1&EN! adaugă unelement nll  la sfâr'itul colecţiei, E1&EN!(n adaugă n elemente nll ,

 E1&EN!(n, i adaugă n copii ale elementului de rang i (nu este validă pentru tipul inde72b4 tables& nu poate fi utilizată pentru a iniţializa ocolecţie atomic nll &

 L"("T  returnează numărul ma*im de elemente ale unei colecţii (cel de la

declarare pentru tipul vector 'i nll  pentru tablouri imbricate (nu estevalidă pentru tipul inde72b4 tables&TR"(  'terge elementele de la sfâr'itul unei colecţii: &#M 'terge ultimul

element, &#M (n 'terge ultimele n elemente (nu este validă pentrutipul inde72b4 tables. "imilar metodei  E1&EN!, metoda &#M operează asupra dimensiunii interne a tabloului imbricat.

 E1#S&S  este singura metodă care poate fi aplicată unei colecţii atomicenll . 8rice altă metodă declan'ează e*cepţia "OLLE"&#ON)#S)NULL.

 Bul) b!'* 

++

Page 23: Baze de date c2_colectii

7/23/2019 Baze de date c2_colectii

http://slidepdf.com/reader/full/baze-de-date-c2colectii 23/26

n e*emplul care urmează, comanda !ELE&E  este trimisă motorului SQL

 pentru fiecare iteraţie a comenzii %O.

 Exemplu&E'L!RE  T$E -,%e 3# &!RR!$(0) O" NUMBER;  al.a -,%e := -,%e(1060680); cod,ri ale @aleriilor

BE73N  "OR I 3N al.a"3R#Tal.aL!#T  ELETE "ROM o/era  2ERE cod_@alerie = al.a (I);  EN LOO;

EN;)entru a realiza mai rapid această operaţie, ar trebui să e*iste posibilitatea

de a 'terge (prelucra întreaga colecţie 'i nu elemente individuale. $e%nica care permite acest lucru este cunoscută sub numele bul) b!'* .

n timpul compilării, compilatorul  PL/SQL  asociază identificatorii cu oadresă, un tip de date 'i o valoare. cest proces este numit binding .

<omenzile SQL din blocurile PL/SQL sunt trimise motorului SQL pentru afi e*ecutate. Hotorul SQL  poate trimite înapoi date motorului  PL/SQL (dee*emplu, ca rezultat al unei interogări. e multe ori, datele care trebuie

manipulate aparţin unei colecţii, iar colecţia este iterată printr-un ciclu  %O.)rin urmare, transferul (în ambele sensuri între SQL 'i  PL/SQL are loc pentrufiecare linie a colecţiei.

ncepând cu OracleDi e*istă posibilitatea ca toate liniile unei colecţii săfie transferate simultan printr-o singură operaţie. )rocedeul este numit bl bind 

'i este realizat cu autorul comenzii %O$LL, ce poate fi folosită cu orice tip decolecţie.

<omanda %O$LL are sinta*a:

FORALL inde7 "N li5)in0..li5)s3  co5anda)sl;

Hotorul SQL  e*ecută co5anda)sl  o singură dată pentru toate valorileinde*ului. "o5anda)sl  este una din comenzile #NSE& , UP!$&E ,  !ELE&E 

care referă elementele uneia sau mai multor colecţii. Variabila inde7  poate fireferită numai în comanda %O$LL 'i numai ca indice de colecţie.

n e*emplul care urmează este optimizată problema anterioară, în sensulcă instrucţiunea !ELE&E  este trimisă motorului SQL o singură dată, pentru toateliniile colecţiei.

 Exemplu&

+6

Page 24: Baze de date c2_colectii

7/23/2019 Baze de date c2_colectii

http://slidepdf.com/reader/full/baze-de-date-c2colectii 24/26

E'L!RE  T$E -,%e 3# &!RR!$(0) O" NUMBER;  al.a -,%e := -,%e(1060680); cod,ri ale @aleriilor

BE73N  9  "OR!LL I 3N al.a"3R#Tal.aL!#T  ELETE "ROM o/era  2ERE cod_@alerie = al.a (I);EN;

)entru utilizarea comenzii  %O$LL  este necesară respectareaurmătoarelor restricţii:

comanda poate fi folosită numai în programe server2side, altfel apareeroarea ?this 0eatre is not s33orted in client2side 3rogra5sJ&• comenziile #NSE& , UP!$&E ,  !ELE&E  trebuie să refere cel puţin o

colecţie&• toate elementele colecţiei din domeniul precizat trebuie să e*iste

(dacă, de e*emplu, un element a fost 'ters, atunci este semnalată oeroare&

• indicii colecţiilor nu pot să fie e*presii 'i trebuie să aibă valoricontinue.

 Exemplu&

'RE!TE T!BLE ee%/l, ( NUMBER6 A NUMBER);E'L!RE  T$E -,%e 3# T!BLE O" NUMBER;  ttt -,%e:= -,%e(1664);BE73N  "OR!LL i 3N ttt"3R#TtttL!#T  3N#ERT 3NTO ee%/l,  &!LUE#(ttt(i)6 10); corect

  "OR!LL i 3N 14  3N#ERT 3NTO ee%/l,  &!LUE#(86 F); ece/tieEN;

  "OR!LL i 3N @a%a"3R#T@a%aL!#T  ELETE "ROM carte  2ERE codel = @a%a(i1);

eroare d,la (e/re+ie +i DL!#T)E'L!RE

+4

Page 25: Baze de date c2_colectii

7/23/2019 Baze de date c2_colectii

http://slidepdf.com/reader/full/baze-de-date-c2colectii 25/26

  T$E al.a 3# T!BLE O" NUMBER;  al.a := al.a(10606406H0);BE73N  ELETE(4);  "OR!LL i 3N "3R#TL!#T  ELETE "ROM carte  2ERE codel = (i); eroareEN;

acă e*istă o eroare în procesarea unei linii printr-o operaţie LM! de tipbl , numai acea linie va fi rollbac .

<ursorul SQL are un atribut compus 8BUL)O-"OUN&  care numără

liniile afectate de iteraţiile comenzii  %O$LL. 8BUL)O-"OUN& (ireprezintă numărul de linii procesate de a i2a e*ecuţie a comenzii SQL. acă nueste afectată nici o linie, valoarea atributului este 1. 8BUL)O-"OUN&  nu

 poate să fie parametru în subprograme 'i nu poate fi asignat altor colecţii.

ncepând cu Oracle9i este utilizabilă o nouă clauză în comanda %O$LL.<lauza, numită S$*E E1"EP&#ONS , permite ca toate e*cepţiile care apar întimpul e*ecuţiei comenzii %O$LL să fie salvate 'i astfel procesarea poate săcontinue. n acest conte*t, poate fi utilizat atributul cursor 8BUL)E1"EP&#ONS  pentru a vizualiza informaţii despre aceste e*cepţii.

tributul acţionează ca un tablou PL/SQL 'i are două câmpuri:• 8BUL)E1"EP&#ONSi.EO)#N!E1 , reprezentând iteraţia în

timpul căreia s-a declan'at e*cepţia&

• 8BUL)E1"EP&#ONSi.EO)"O!E , reprezentând codulOracle al erorii respective.

%egăsirea rezultatului unei interogări în colecţii (înainte de a fi trimisămotorului PL/SQL se poate obţine cu autorul clauzei BUL "OLLE"& .

<lauza poate să apară în:

• comenzile SELE"& #N&O (cursoare implicite ,

• comenzile %E&"+ #N&O (cursoare e*plicite,

• clauza E&UN#N' #N&O a comenzilor #NSE& , UP!$&E , !ELE&E .

<lauza are următoarea sinta*ă:

@ BUL+ COLLECT "NTO n5e)colecKie @ <n5e)colecKieA@

E'L!RE  T$E ti/1 3# T!BLE O" o/eracod_o/eraT$E;

+#

Page 26: Baze de date c2_colectii

7/23/2019 Baze de date c2_colectii

http://slidepdf.com/reader/full/baze-de-date-c2colectii 26/26

  T$E ti/ 3# T!BLE O" o/eratitl,T$E;  al.a ti/1;  eta ti/;

BE73N  9  J> %otor,l #KL i-carca i- i-tre@i%e coloa-ele  cod_o/era +i titl, i- taelele i%ricate6  i-ai-te de a ret,r-a

taelele %otor,l,i LJ#KL >J  #ELE'T cod_o/era6 titl, BUL 'OLLE'T 3NTO al.a6eta  "ROM o/era;  9  J> daca ei+ta - o/ere de arta i- +tare ,-a6  at,-ci al.a va co-ti-e cod,rile celor - o/ere >J  ELETE "ROM o/era 2ERE +tare = *,-a*  RETURN3N7 cod_o/era BUL 'OLLE'T 3NTO al.a;  9EN;

<omanda %O$LL se poate combina cu clauza BUL "OLLE"& . $otu'i,trebuie subliniat că ele nu pot fi folosite simultan în comanda SELE"& .

Hotorul "K incarca toate liniile unei coloane. <um se poate limitanumarul de linii procesateI /*emplelele urmatoare dau + variante de rezolvare.

E'L!RE  T$E al.a 3# T!BLE O" carte/retT$E;  al.a;BE73N  #ELE'T /ret BUL 'OLLE'T 3NTO   "ROM carte 2ERE RO2NUM C= 500;EN;

E'L!RE

  9  zz N!TUR!L := 10;BE73N  OEN c1;  LOO  "ET' c1 BUL 'OLLE'T 3NTO 6 AA L3M3T zz;  E<3T 2EN c1NOT"OUN;  9EN;

+;