Colecții Oracle PL / SQL: Varrays, imbricate & Index după tabele

Cuprins:

Anonim

Ce este Colecția?

O colecție este un grup ordonat de elemente ale anumitor tipuri de date. Poate fi o colecție de tipuri simple de date sau tipuri complexe de date (cum ar fi tipurile de înregistrări sau definite de utilizator).

În colecție, fiecare element este identificat printr-un termen numit „subscript”. Fiecare articol din colecție este atribuit cu un indice unic. Datele din acea colecție pot fi manipulate sau preluate prin referirea la acel indice unic.

Colecțiile sunt cele mai utile lucruri atunci când trebuie prelucrate sau manipulate date mari de același tip. Colecțiile pot fi populate și manipulate ca întreg folosind opțiunea „BULK” din Oracle.

În acest tutorial, veți învăța-

  • Ce este Colecția?
  • Varrays
  • Mese cuibărite
  • Index-după-tabel
  • Concept de constructor și inițializare în colecții
  • Metode de colectare

Colecțiile sunt clasificate pe baza structurii, a indicelui și a stocării, așa cum se arată mai jos.

  • Index-după-tabele (de asemenea, cunoscut sub numele de Associative Array)
  • Tabelele imbricate
  • Varrays

În orice moment, datele din colecție pot fi denumite prin trei termeni Numele colecției, subscript, câmp / nume coloană ca „ (). ”. Veți afla mai multe despre aceste categorii de colecții menționate mai sus în secțiunea de mai jos.

Varrays

Varray este o metodă de colectare în care dimensiunea matricei este fixă. Dimensiunea matricei nu poate fi depășită decât valoarea sa fixă. Indicele Varray are o valoare numerică. Următoarele sunt atributele Varrays.

  • Dimensiunea limitei superioare este fixă
  • Populat secvențial începând cu indicele „1”
  • Acest tip de colecție este întotdeauna dens, adică nu putem șterge niciun element de matrice. Varray poate fi șters ca întreg sau poate fi tăiat de la sfârșit.
  • Deoarece are întotdeauna o natură densă, are o flexibilitate foarte redusă.
  • Este mai potrivit să se utilizeze atunci când este cunoscută dimensiunea matricei și să se efectueze activități similare pe toate elementele matricei.
  • Indicele și secvența rămân întotdeauna stabile, adică indicele și numărul colecției sunt întotdeauna aceleași.
  • Trebuie inițializate înainte de a le utiliza în programe. Orice operație (cu excepția operației EXISTS) dintr-o colecție neinițială va genera o eroare.
  • Poate fi creat ca obiect de bază de date, care este vizibil în toată baza de date sau în interiorul subprogramului, care poate fi utilizat numai în acel subprogram.

Figura de mai jos va explica schematic alocarea memoriei Varray (densă).

Indice 1 2 3 4 5 6 7
Valoare Xyz Dfv Sde Cxs Vbc Nhu Qwe

Sintaxa pentru VARRAY:

TYPE  IS VARRAY () OF ;
  • În sintaxa de mai sus, type_name este declarat ca VARIA de tipul 'DATA_TYPE' pentru limita de dimensiune dată. Tipul de date poate fi simplu sau complex.

Mese cuibărite

Un tabel imbricat este o colecție în care dimensiunea matricei nu este fixă. Are tipul de indice numeric. Mai jos sunt mai multe descrieri despre tipul de tabel imbricat.

  • Tabelul imbricat nu are limită de dimensiune superioară.
  • Deoarece limita de dimensiune superioară nu este fixată, colecția, memoria trebuie extinsă de fiecare dată înainte de ao folosi. Putem extinde colecția folosind cuvântul cheie „EXTEND”.
  • Populat secvențial începând cu indicele „1”.
  • Acest tip de colecție poate fi atât dens cât și rar , adică putem crea colecția ca dens și putem, de asemenea, să ștergem aleatoriu elementul matrice individual, ceea ce îl face să fie rar.
  • Oferă mai multă flexibilitate în ceea ce privește ștergerea elementului matrice.
  • Este stocat în tabelul bazei de date generat de sistem și poate fi utilizat în interogarea selectată pentru a prelua valorile.
  • Indiciul și secvența nu sunt stabile, adică indicele și numărul elementului matricei pot varia.
  • Trebuie inițializate înainte de a le utiliza în programe. Orice operație (cu excepția operației EXISTS) din colecția neinițializată va genera o eroare.
  • Poate fi creat ca obiect de bază de date, care este vizibil în toată baza de date sau în interiorul subprogramului, care poate fi utilizat numai în acel subprogram.

Figura de mai jos va explica schematic alocarea memoriei Tabelului imbricat (dens și rar). Spațiul elementului negru indică elementul gol dintr-o colecție, adică rar.

Indice 1 2 3 4 5 6 7
Valoare (densă) Xyz Dfv Sde Cxs Vbc Nhu Qwe
Valoare (rar) Qwe Asd Afg Asd Noi suntem

Sintaxa pentru tabelul imbricat:

TYPE  IS TABLE OF ;
  • În sintaxa de mai sus, type_name este declarat ca colecție de tabele imbricate de tipul „DATA_TYPE”. Tipul de date poate fi simplu sau complex.

Index-după-tabel

Index-by-table este o colecție în care dimensiunea matricei nu este fixă. Spre deosebire de celelalte tipuri de colecții, în colecția index-by-table, indicele poate fi definit de către utilizator. Următoarele sunt atributele index-by-table.

  • Indicele poate conține numere întregi sau șiruri. În momentul creării colecției, trebuie menționat tipul de indice.
  • Aceste colecții nu sunt stocate secvențial.
  • Ele sunt întotdeauna rare în natură.
  • Dimensiunea matricei nu este fixă.
  • Nu pot fi stocate în coloana bazei de date. Acestea vor fi create și utilizate în orice program din acea sesiune.
  • Ele oferă mai multă flexibilitate în ceea ce privește menținerea indicelui.
  • De asemenea, indicii pot avea o secvență de indici negativi.
  • Sunt mai potrivite pentru a fi utilizate pentru valori colective relativ mai mici, în care colecția poate fi inițializată și utilizată în cadrul acelorași subprograme.
  • Nu trebuie inițializate înainte de a începe să le utilizați.
  • Nu poate fi creat ca obiect de bază de date. Poate fi creat numai în interiorul subprogramului, care poate fi utilizat numai în acel subprogram.
  • BULK COLLECT nu poate fi utilizat în acest tip de colecție, deoarece indicele ar trebui să fie dat în mod explicit pentru fiecare înregistrare din colecție.

Figura de mai jos va explica schematic alocarea memoriei Tabelului imbricat (rar). Spațiul elementului negru indică elementul gol dintr-o colecție, adică rar.

Indice (varchar) PRIMUL AL DOILEA AL TREILEA AL PATRULEA A CINCEA ŞASELEA AL ȘAPTELEA
Valoare (rar) Qwe Asd Afg Asd Noi suntem

Sintaxa pentru Index-by-Table

TYPE  IS TABLE OF  INDEX BY VARCHAR2 (10);
  • În sintaxa de mai sus, type_name este declarat ca o colecție index-by-table de tipul „DATA_TYPE”. Tipul de date poate fi simplu sau complex. Variabila subsciprt / index este dată ca tip VARCHAR2 cu dimensiunea maximă 10.

Concept de constructor și inițializare în colecții

Constructorii sunt funcția încorporată furnizată de oracolul care are același nume ca al obiectului sau colecțiilor. Acestea sunt executate mai întâi ori de câte ori obiectul sau colecțiile sunt trimise pentru prima dată într-o sesiune. Mai jos sunt detaliile importante ale constructorului în contextul colecției:

  • Pentru colecții, acești constructori ar trebui chemați explicit pentru a-l inițializa.
  • Atât tabelele Varray, cât și tabelele imbricate trebuie inițializate prin intermediul acestor constructori înainte de a fi trimise în program.
  • Constructorul extinde implicit alocarea memoriei pentru o colecție (cu excepția Varray), prin urmare constructorul poate atribui și variabilele colecțiilor.
  • Atribuirea valorilor colecției prin intermediul constructorilor nu va face niciodată colecția rară.

Metode de colectare

Oracle oferă multe funcții pentru a manipula și a lucra cu colecțiile. Aceste funcții sunt foarte utile în program pentru a determina și a modifica diferitele atribute ale colecțiilor. Tabelul următor va prezenta diferitele funcții și descrierea acestora.

Metodă Descriere SINTAXĂ
EXISTĂ (n) Această metodă va returna rezultatele booleene. Va returna „ADEVĂRAT” dacă al n- lea element există în acea colecție, altfel va returna FALS. Numai funcțiile EXISTS pot fi utilizate în colecția neinițializată .EXISTĂ (poziție_element)
NUMARA Oferă numărul total al elementelor prezente într-o colecție .COUNT
LIMITĂ Returnează dimensiunea maximă a colecției. Pentru Varray, acesta va returna dimensiunea fixă ​​care a fost definită. Pentru tabelul imbricat și Index-după-tabel, dă NULL .LIMIT
PRIMUL Returnează valoarea primei variabile index (subscript) a colecțiilor .FIRST
ULTIMUL Returnează valoarea ultimei variabile index (subscript) a colecțiilor . ULTIMA
ANTERIOR (n) Returnările preced variabila index într-o colecție a celui de-al n- lea element. Dacă nu există valoarea precedentă a indexului, se returnează NULL .PRIOR (n)
NEXT (n) Returnează reușește variabila index într-o colecție a celui de-al n- lea element. Dacă nu există niciun indiciu de succes, se returnează NULL .NEXT (n)
EXTINDE Extinde un element dintr-o colecție la sfârșit .EXTEND
EXTEND (n) Extinde n elemente la sfârșitul unei colecții .EXTEND (n)
EXTEND (n, i) Extinde n copii ale i - lea element de la finalul colecției .EXTEND (n, i)
TUNDE Elimină un element de la sfârșitul colecției .TRIM
TRIM (n) Elimină n elemente de la sfârșitul colecției .TRIM (n)
ȘTERGE Șterge toate elementele din colecție. Face colecția goală .DELETE
ȘTERGE (n) Șterge al n-lea element din colecție. Dacă al n- lea element este NULL, atunci acest lucru nu va face nimic .DELETE (n)
ȘTERGERE (m, n) Șterge elementul din intervalul m - lea la n - lea în colecția .DELETE (m, n)

Exemplul 1: tip de înregistrare la nivel de subprogram

În acest exemplu, vom vedea cum să populăm colecția folosind „BULK COLLECT” și cum să trimitem datele colectării.

DECLARETYPE emp_det IS RECORD(EMP_NO NUMBER,EMP_NAME VARCHAR2(150),MANAGER NUMBER,SALARY NUMBER);TYPE emp_det_tbl IS TABLE OF emp_det; guru99_emp_rec emp_det_tbl:= emp_det_tbl();BEGININSERT INTO emp (emp_no,emp_name, salary, manager) VALUES (1000,’AAA’,25000,1000);INSERT INTO emp (emp_no,emp_name, salary, manager) VALUES (1001,'XXX’,10000,1000);INSERT INTO emp (emp_no, emp_name, salary, manager) VALUES (1002,'YYY',15000,1000);INSERT INTO emp (emp_no,emp_name,salary, manager) VALUES (1003,’ZZZ’,'7500,1000);COMMIT:SELECT emp no,emp_name,manager,salary BULK COLLECT INTO guru99_emp_recFROM emp;dbms_output.put_line (‘Employee Detail');FOR i IN guru99_emp_rec.FIRST… guru99_emp_rec.LASTLOOPdbms_output.put_line (‘Employee Number: '||guru99_emp_rec(i).emp_no);dbms_output.put_line (‘Employee Name: '||guru99_emp_rec(i).emp_name);dbms_output.put_line (‘Employee Salary:'|| guru99_emp_rec(i).salary);dbms_output.put_line(‘Employee Manager Number:'||guru99_emp_rec(i).manager);dbms_output.put_line('--------------------------------');END LOOP;END;/

Explicatie cod:

  • Linia de cod 2-8 : Tipul de înregistrare „emp_det” este declarat cu coloanele emp_no, emp_name, salariu și managerul tipului de date NUMBER, VARCHAR2, NUMBER, NUMBER.
  • Linia de cod 9: Crearea colecției „emp_det_tbl” a elementului de tip înregistrare „emp_det”
  • Linia de cod 10: Declararea variabilei „guru99_emp_rec” ca tip „emp_det_tbl” și inițializată cu un constructor nul.
  • Linia de cod 12-15: Introducerea eșantionului de date în tabelul „emp”.
  • Linia de cod 16: Realizarea tranzacției de inserare.
  • Linia de cod 17: Extragerea înregistrărilor din tabelul „emp” și popularea variabilei de colectare ca bloc utilizând comanda „BULK COLLECT”. Acum variabila „guru99_emp_rec” conține toate înregistrările care sunt prezente în tabelul „emp”.
  • Linia de cod 19-26: Setarea buclei „PENTRU” folosind pentru a imprima una câte una toate înregistrările din colecție. Metoda de colectare FIRST și LAST este utilizată ca limită inferioară și superioară a buclei.

Ieșire : După cum puteți vedea în captura de ecran de mai sus când codul de mai sus este executat, veți obține următoarea ieșire

Employee DetailEmployee Number: 1000Employee Name: AAAEmployee Salary: 25000Employee Manager Number: 1000----------------------------------------------Employee Number: 1001Employee Name: XXXEmployee Salary: 10000Employee Manager Number: 1000----------------------------------------------Employee Number: 1002Employee Name: YYYEmployee Salary: 15000Employee Manager Number: 1000----------------------------------------------Employee Number: 1003Employee Name: ZZZEmployee Salary: 7500Employee Manager Number: 1000----------------------------------------------