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 ----------------------------------------------