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.

Vrsta zapisa na razini potprograma

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

Saลพmite ovu objavu uz: