Oracle PL/SQL zbirke: Varrays, Nested & Index by Tables
ล to je zbirka?
Zbirka je ureฤena skupina elemenata odreฤenih vrsta podataka. To moลพe biti skup jednostavnih tipova podataka ili sloลพenih tipova podataka (kao ลกto su korisniฤki definirani ili tipovi zapisa).
U zbirci je svaki element identificiran pojmom tzv "potpis." Svakom predmetu u zbirci dodijeljen je jedinstveni indeks. Podacima u toj zbirci moลพe se manipulirati ili dohvaฤati pozivanjem na taj jedinstveni indeks.
Kolekcije su najkorisnije stvari kada je potrebno obraditi ili manipulirati velikim podacima iste vrste. Zbirke se mogu popunjavati i manipulirati njima kao cjelinom pomoฤu opcije 'BULK' Oracle.
Zbirke su klasificirane na temelju strukture, indeksa i pohrane kao ลกto je prikazano u nastavku.
- Indeks po tablicama (takoฤer poznat kao asocijativni niz)
- Ugnijeลพฤene tablice
- Varrays
U bilo kojem trenutku, podaci u zbirci mogu se referirati pomoฤu tri pojma: naziv zbirke, indeks, naziv polja/stupca kao " ( ). โ. Viลกe o ovim gore navedenim kategorijama zbirki saznat ฤete u odjeljku u nastavku.
Varrays
Varray je metoda prikupljanja u kojoj je veliฤina niza fiksna. Veliฤina niza ne moลพe se premaลกiti od njegove fiksne vrijednosti. Indeks Varray ima numeriฤku vrijednost. Slijede atributi Varraya.
- Veliฤina gornje granice je fiksna
- Popunjava se redom poฤevลกi od indeksa '1'
- Ova vrsta zbirke je uvijek gusta, tj. ne moลพemo izbrisati nijedan element niza. Varray se moลพe obrisati u cjelini ili se moลพe srezati s kraja.
- Buduฤi da je po prirodi uvijek gust, ima vrlo manju fleksibilnost.
- Prikladnije je koristiti kada je veliฤina polja poznata i izvoditi sliฤne aktivnosti na svim elementima polja.
- Indeks i niz uvijek ostaju stabilni, tj. indeks i broj zbirke uvijek su isti.
- Potrebno ih je inicijalizirati prije koriลกtenja u programima. Svaka operacija (osim operacije EXISTS) na neinicijaliziranoj kolekciji izbacit ฤe pogreลกku.
- Moลพe se kreirati kao objekt baze podataka, koji je vidljiv u cijeloj bazi ili unutar potprograma, koji se moลพe koristiti samo u tom potprogramu.
Donja slika ฤe dijagramski objasniti dodjelu memorije za Varray (gusto).
| Potpisan | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| Joลก malo brojeva | X Y Z | Dfv | Sde | Cxs | Vbc | Mekana | Qwe |
Sintaksa za VARRAY:
TYPE <type_name> IS VARRAY (<SIZE>) OF <DATA_TYPE>;
- U gornjoj sintaksi, type_name je deklariran kao VARRAY tipa 'DATA_TYPE' za dano ograniฤenje veliฤine. Tip podataka moลพe biti jednostavan ili sloลพen tip.
Ugnijeลพฤene tablice
Ugnijeลพฤena tablica je zbirka u kojoj veliฤina niza nije fiksna. Ima tip numeriฤkog indeksa. U nastavku je viลกe opisa o vrsti ugnijeลพฤene tablice.
- Ugnijeลพฤena tablica nema gornje ograniฤenje veliฤine.
- Buduฤi da gornja granica veliฤine nije fiksna, kolekciju, memoriju treba proลกiriti svaki put prije nego ลกto je upotrijebimo. Kolekciju moลพemo proลกiriti pomoฤu kljuฤne rijeฤi 'EXTEND'.
- Popunjava se redom poฤevลกi od indeksa '1'.
- Ova vrsta zbirke moลพe biti oboje gusta i rijetka, tj. kolekciju moลพemo kreirati kao gustu, a moลพemo i nasumiฤno brisati pojedinaฤni element niza, ลกto ga ฤini prorijeฤenim.
- Daje veฤu fleksibilnost u pogledu brisanja elementa niza.
- Pohranjuje se u tablici baze podataka generiranoj sustavom i moลพe se koristiti u upitu odabira za dohvaฤanje vrijednosti.
- Indeks i niz nisu stabilni, tj. indeks i broj elementa niza mogu varirati.
- Potrebno ih je inicijalizirati prije koriลกtenja u programima. Svaka operacija (osim operacije EXISTS) na neinicijaliziranoj kolekciji izbacit ฤe pogreลกku.
- Moลพe se kreirati kao objekt baze podataka, koji je vidljiv u cijeloj bazi ili unutar potprograma, koji se moลพe koristiti samo u tom potprogramu.
Donja slika ฤe dijagramski objasniti dodjelu memorije ugnijeลพฤene tablice (guste i rijetke). Crno obojeni prostor elementa oznaฤava prazan element u kolekciji, tj. rijedak.
| Potpisan | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| Vrijednost (gusta) | X Y Z | Dfv | Sde | Cxs | Vbc | Mekana | Qwe |
| Vrijednost (rijetka) | Qwe | asd | Afg | asd | Wer |
Sintaksa za ugnijeลพฤenu tablicu:
TYPE <tvpe name> IS TABLE OF <DATA TYPE>;
- U gornjoj sintaksi, type_name je deklariran kao kolekcija ugnijeลพฤene tablice tipa 'DATA_TYPE'. Tip podataka moลพe biti jednostavan ili sloลพen tip.
Indeks po tablici
Indeks po tablici je zbirka u kojoj veliฤina niza nije fiksna. Za razliku od ostalih tipova zbirki, u zbirci indeks po tablici indeks moลพe definirati korisnik. Slijede atributi indeksa po tablici.
- Indeks moลพe biti cijeli broj ili niz. Prilikom izrade zbirke treba navesti vrstu indeksa.
- Ove zbirke se ne pohranjuju uzastopno.
- U prirodi su uvijek rijetki.
- Veliฤina niza nije fiksna.
- Ne mogu se pohraniti u stupac baze podataka. Moraju se stvoriti i koristiti u bilo kojem programu u toj odreฤenoj sesiji.
- Daju veฤu fleksibilnost u smislu odrลพavanja indeksa.
- Indeksi mogu biti i negativnog niza indeksa.
- Prikladniji su za koriลกtenje za relativno manje skupne vrijednosti u kojima se zbirka moลพe inicijalizirati i koristiti unutar istih potprograma.
- Ne moraju se inicijalizirati prije nego ลกto se poฤnu koristiti.
- Ne moลพe se stvoriti kao objekt baze podataka. Moลพe se kreirati samo unutar potprograma, koji se moลพe koristiti samo u tom potprogramu.
- BULK COLLECT se ne moลพe koristiti u ovoj vrsti zbirke jer indeks treba biti dat izriฤito za svaki zapis u zbirci.
Donja slika ฤe dijagramski objasniti dodjelu memorije ugnijeลพฤene tablice (rijetke). Crno obojeni prostor elementa oznaฤava prazan element u kolekciji, tj. rijedak.
| indeks (varchar) | PRVI | DRUGI | TREฤA | ฤETVRTI | PETI | ล ESTI | SEDMI |
| Vrijednost (rijetka) | Qwe | asd | Afg | asd | Wer |
Sintaksa za indeks po tablici
TYPE <type_name> IS TABLE OF <DATA_TYPE> INDEX BY VARCHAR2 (10);
- U gornjoj sintaksi, type_name je deklariran kao zbirka indeksa po tablici tipa 'DATA_TYPE'. Tip podataka moลพe biti jednostavan ili sloลพen tip. Varijabla subsciprt/index dana je kao tip VARCHAR2 s maksimalnom veliฤinom od 10.
Konstruktor i koncept inicijalizacije u zbirkama
Konstruktori su ugraฤene funkcije koje pruลพa oracle i imaju isto ime kao objekt ili zbirke. Izvode se prvi kad god se objekt ili zbirke upuฤuju prvi put u sesiji. Ispod su vaลพni detalji konstruktora u kontekstu zbirke:
- Za zbirke, ove konstruktore treba izriฤito pozvati kako bi je inicijalizirali.
- I Varray i Nested tablice moraju se inicijalizirati kroz ove konstruktore prije upuฤivanja u program.
- Konstruktor implicitno proลกiruje dodjelu memorije za kolekciju (osim Varray), stoga konstruktor takoฤer moลพe dodijeliti varijable kolekcijama.
- Dodjeljivanje vrijednosti kolekciji putem konstruktora nikada neฤe uฤiniti kolekciju prorijeฤenom.
Metode prikupljanja
Oracle pruลพa mnoge funkcije za rukovanje i rad sa zbirkama. Ove su funkcije vrlo korisne u programu za odreฤivanje i izmjenu razliฤitih atributa zbirki. Sljedeฤa tablica ฤe dati razliฤite funkcije i njihov opis.
| naฤin | Description | SINTAKSA |
|---|---|---|
| POSTOJI (n) | Ova metoda ฤe vratiti Booleove rezultate. Vratit ฤe 'TRUE' ako nth element postoji u toj kolekciji, inaฤe ฤe vratiti FALSE. Samo EXISTS funkcije mogu se koristiti u neinicijaliziranoj zbirci | .EXISTS(pozicija_elementa) |
| TOฤKA | Daje ukupan broj elemenata prisutnih u zbirci | .RAฤUNATI |
| OGRANIฤAVA | Vraฤa maksimalnu veliฤinu zbirke. Za Varray ฤe vratiti fiksnu veliฤinu koja je definirana. Za ugnijeลพฤenu tablicu i indeks po tablicu daje NULL | .OGRANIฤITI |
| PRVI | Vraฤa vrijednost prve indeksne varijable (indeks) zbirki | .PRVI |
| LAST | Vraฤa vrijednost posljednje indeksne varijable (indeks) zbirki | .POSLJEDNJI |
| PRIJE (n) | Vraฤa ispred varijable indeksa u kolekciji nth element. Ako ne postoji prethodna vrijednost indeksa, vraฤa se NULL | .PRIJED(n) |
| DALJE (n) | Vraฤa uspjeลกno indeksnu varijablu u kolekciji nth element. Ako nema uspjeลกnog indeksa, vraฤa se vrijednost NULL | .DALJE(n) |
| PRODUลฝI | Proลกiruje jedan element u zbirci na kraju | .PRODUลฝITI |
| PRODUลฝITI (n) | Proลกiruje n elemenata na kraju zbirke | .EXTEND(n) |
| PRODUลฝITI (n,i) | Proลกiruje n kopija ith element na kraju zbirke | .EXTEND(n,i) |
| TRIM | Uklanja jedan element s kraja zbirke | .STRIM |
| TRIM (n) | Uklanja n elemenata s kraja zbirke | .TRIM (n) |
| DELETE | Briลกe sve elemente iz kolekcije. Kolekciju ฤini praznom | .IZBRISATI |
| IZBRIล I (n) | Briลกe n-ti element iz kolekcije. Ako tadath element je NULL, onda ovo neฤe uฤiniti niลกta | .DELETE(n) |
| IZBRIล I (m,n) | Briลกe element u rasponu mth prema nth u zbirci | .DELETE(m,n) |
Primjer1: Vrsta zapisa na razini potprograma
U ovom primjeru ฤemo vidjeti kako popuniti zbirku koristeฤi 'RASINSKO SAKUPLJANJE' i kako uputiti podatke o zbirci.
DECLARE
TYPE 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();
BEGIN
INSERT 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_rec
FROM emp;
dbms_output.put_line (โEmployee Detail');
FOR i IN guru99_emp_rec.FIRST..guru99_emp_rec.LAST
LOOP
dbms_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;
/
Objaลกnjenje koda:
- Redak koda 2-8: Vrsta zapisa 'emp_det' je deklariran sa stupcima emp_no, emp_name, salary i manager tipa podataka NUMBER, VARCHAR2, NUMBER, NUMBER.
- Redak koda 9: Stvaranje kolekcije 'emp_det_tbl' elementa vrste zapisa 'emp_det'
- Redak koda 10: Deklaracija varijable 'guru99_emp_rec' kao tipa 'emp_det_tbl' i inicijalizacija s null konstruktorom.
- Redak koda 12-15: Umetanje uzorka podataka u 'emp' tablicu.
- Redak koda 16: Izvrลกavanje transakcije umetanja.
- Redak koda 17: Dohvaฤanje zapisa iz 'emp' tablice i skupno popunjavanje varijable zbirke pomoฤu naredbe โBULK COLLECTโ. Sada varijabla 'guru99_emp_rec' sadrลพi sve zapise koji su prisutni u tablici 'emp'.
- Redak koda 19-26: Postavljanje petlje 'ZA' za ispis svih zapisa u zbirci jedan po jedan. Metoda prikupljanja FIRST i LAST koristi se kao donja i gornja granica petlja.
Izlaz: Kao ลกto moลพete vidjeti na gornjoj snimci zaslona, โโkada se gornji kod izvrลกi, dobit ฤete sljedeฤi izlaz
Employee Detail Employee Number: 1000 Employee Name: AAA Employee Salary: 25000 Employee Manager Number: 1000 ---------------------------------------------- Employee Number: 1001 Employee Name: XXX Employee Salary: 10000 Employee Manager Number: 1000 ---------------------------------------------- Employee Number: 1002 Employee Name: YYY Employee Salary: 15000 Employee Manager Number: 1000 ---------------------------------------------- Employee Number: 1003 Employee Name: ZZZ Employee Salary: 7500 Employee Manager Number: 1000 ----------------------------------------------

