Oracle PL/SQL-kogud: Varrays, Pesastatud ja Indeks tabelite järgi

Mis on kollektsioon?

Kogu on teatud andmetüüpide elementide järjestatud rühm. See võib olla lihtsate andmetüüpide või keerukate andmetüüpide kogum (nt kasutaja määratud või kirjetüübid).

Kollektsioonis on iga element identifitseeritud terminiga, mida nimetatakse "allindeks." Igale kollektsiooni üksusele on määratud kordumatu alamindeks. Selles kogus olevaid andmeid saab manipuleerida või tuua, viidates sellele ainulaadsele alamindeksile.

Kogud on kõige kasulikumad asjad, kui on vaja töödelda või manipuleerida suuri sama tüüpi andmeid. Kogusid saab asustada ja tervikuna manipuleerida, kasutades suvandit „BULK”. Oracle.

Kogud klassifitseeritakse struktuuri, alaindeksi ja salvestusruumi alusel, nagu allpool näidatud.

  • Tabelite indeks (tuntud ka kui assotsiatiivne massiiv)
  • Pesastatud lauad
  • Varrays

Igal hetkel saab kogus olevatele andmetele viidata kolme terminiga kogu nimi, alamindeks, välja/veeru nimi kui " ( ). ”. Nende ülalnimetatud kogude kategooriate kohta leiate teavet allpool olevast jaotisest.

Varrays

Varray on kogumismeetod, mille puhul on massiivi suurus fikseeritud. Massiivi suurust ei saa ületada selle fikseeritud väärtusest. Varray alaindeksil on arvväärtus. Järgnevalt on toodud Varraysi atribuudid.

  • Ülemine piirsuurus on fikseeritud
  • Täidetud järjestikku, alustades alaindeksiga '1'
  • See kogu tüüp on alati tihe, st me ei saa ühtegi massiivi elementi kustutada. Varray saab kustutada tervikuna või kärpida seda lõpust.
  • Kuna see on oma olemuselt alati tihe, on see väga vähem paindlik.
  • Seda on sobivam kasutada siis, kui massiivi suurus on teada ja teha sarnaseid tegevusi kõigi massiivi elementidega.
  • Alamindeks ja jada jäävad alati stabiilseks, st kogu alamindeks ja arv on alati samad.
  • Enne programmides kasutamist tuleb need lähtestada. Kõik toimingud (välja arvatud toiming EXISTS) initsialiseerimata koguga põhjustavad vea.
  • Seda saab luua andmebaasiobjektina, mis on nähtav kogu andmebaasis või alamprogrammi sees, mida saab kasutada ainult selles alamprogrammis.

Allolev joonis selgitab skemaatiliselt Varray (tihe) mälujaotust.

indeks 1 2 3 4 5 6 7
Väärtus X Y Z Dfv Sde Cxs Vbc Nhu Qwe

VARRAY süntaks:

TYPE <type_name> IS VARRAY (<SIZE>) OF <DATA_TYPE>;
  • Ülaltoodud süntaksis on tüübi_nimi antud suurusepiirangu puhul deklareeritud tüübi 'DATA_TYPE' VARRAY. Andmetüüp võib olla kas lihtne või keeruline.

Pesastatud tabelid

Pesastatud tabel on kogum, milles massiivi suurus ei ole fikseeritud. Sellel on numbriline alamindeksi tüüp. Allpool on rohkem pesastatud tabelitüübi kirjeldusi.

  • Pesastatud tabelil ei ole ülemist suurusepiirangut.
  • Kuna suuruse ülempiir ei ole fikseeritud, tuleb kogu, mälu iga kord enne selle kasutamist laiendada. Kollektsiooni saame laiendada märksõna 'EXTEND' abil.
  • Täidetakse järjestikku, alustades alaindeksiga '1'.
  • See kogumise tüüp võib olla mõlemat tihe ja hõrest saame kollektsiooni luua tihedana, samuti saame üksiku massiivi elemendi juhuslikult kustutada, mis muudab selle hõredaks.
  • See annab massiivielemendi kustutamisel suurema paindlikkuse.
  • See salvestatakse süsteemi loodud andmebaasi tabelisse ja seda saab väärtuste toomiseks kasutada valikupäringus.
  • Alamindeks ja jada ei ole stabiilsed, st massiivi elemendi alamindeks ja arv võivad varieeruda.
  • Enne programmides kasutamist tuleb need lähtestada. Kõik toimingud (välja arvatud toiming EXISTS) initsialiseerimata koguga annavad vea.
  • Seda saab luua andmebaasiobjektina, mis on nähtav kogu andmebaasis või alamprogrammi sees, mida saab kasutada ainult selles alamprogrammis.

Allolev joonis selgitab pesastatud tabeli (tihe ja hõre) mälujaotust skemaatiliselt. Musta värvi elemendiruum tähistab kogus olevat tühja elementi, st hõredat.

indeks 1 2 3 4 5 6 7
Väärtus (tihe) X Y Z Dfv Sde Cxs Vbc Nhu Qwe
Väärtus (hõre) Qwe Asd Afg Asd Wer

Pesastatud tabeli süntaks:

TYPE <tvpe name> IS TABLE OF <DATA TYPE>;
  • Ülaltoodud süntaksis on tüübi_nimi deklareeritud pesastatud tabelikoguna, mille tüüp on 'DATA_TYPE'. Andmetüüp võib olla kas lihtne või keeruline.

Indeks tabeli kaupa

Indeks-tabeli järgi on kogum, milles massiivi suurus ei ole fikseeritud. Erinevalt teistest kogutüüpidest võib tabelipõhises kogus alamindeksi koosneda kasutaja poolt määratletud. Järgnevalt on toodud indeksi-tabeli atribuudid.

  • Alamindeks võib olla täisarv või string. Kogu loomise ajal tuleks mainida alamindeksi tüüp.
  • Neid kogusid ei salvestata järjestikku.
  • Looduses on nad alati hõredad.
  • Massiivi suurus pole fikseeritud.
  • Neid ei saa andmebaasi veerus salvestada. Need luuakse ja neid kasutatakse selle konkreetse seansi mis tahes programmis.
  • Need annavad alamindeksi säilitamisel suurema paindlikkuse.
  • Alamindeksid võivad olla ka negatiivse alaindeksiga.
  • Neid on sobivam kasutada suhteliselt väiksemate kollektiivsete väärtuste jaoks, kus kogu saab lähtestada ja kasutada samades alamprogrammides.
  • Enne kasutamist ei pea neid lähtestama.
  • Seda ei saa luua andmebaasiobjektina. Seda saab luua ainult alamprogrammi sees, mida saab kasutada ainult selles alamprogrammis.
  • Funktsiooni BULK COLLECT ei saa selles kogutüübis kasutada, kuna alamindeks tuleks anda selgelt iga kogu kirje jaoks.

Allolev joonis selgitab pesastatud tabeli (hõre) mälujaotust skemaatiliselt. Musta värvi elemendiruum tähistab kogus olevat tühja elementi, st hõredat.

Alamindeks (varchar) ESIMESE TEINE KOLMAS NELJAS VIIES KUUES SEITSMES
Väärtus (hõre) Qwe Asd Afg Asd Wer

Indeksi-tabeli süntaks

TYPE <type_name> IS TABLE OF <DATA_TYPE> INDEX BY VARCHAR2 (10);
  • Ülaltoodud süntaksis on tüübi_nimi deklareeritud tüübi 'DATA_TYPE' indeksitabelite kaupa. Andmetüüp võib olla kas lihtne või keeruline. Subscipt/index muutuja on antud tüübina VARCHAR2 maksimaalse suurusega 10.

Konstruktor ja initsialiseerimise kontseptsioon kogudes

Konstruktorid on oraakli pakutav sisseehitatud funktsioon, millel on sama nimi kui objektil või kogudel. Need käivitatakse esimesena, kui objektile või kogudele seansi jooksul esimest korda viidatakse. Allpool on toodud konstruktori olulised üksikasjad kogu kontekstis:

  • Kogude puhul tuleks need konstruktorid selle lähtestamiseks selgesõnaliselt kutsuda.
  • Nii Varray kui ka Nested tabelid tuleb enne programmi suunamist nende konstruktorite kaudu lähtestada.
  • Konstruktor laiendab kaudselt kogule (välja arvatud Varray) mälu eraldamist, seega saab konstruktor määrata ka kogudele muutujad.
  • Kollektsioonile väärtuste omistamine konstruktorite kaudu ei muuda kollektsiooni kunagi hõredaks.

Kogumismeetodid

Oracle pakub palju funktsioone kogudega manipuleerimiseks ja nendega töötamiseks. Need funktsioonid on programmis väga kasulikud kogude erinevate atribuutide määramiseks ja muutmiseks. Järgmises tabelis on toodud erinevad funktsioonid ja nende kirjeldus.

Meetod Kirjeldus SÜNTAKS
OLEMAS (n) See meetod tagastab Boole'i ​​tulemused. See tagastab 'TRUE', kui nth element on selles kogus olemas, vastasel juhul tagastab see FALSE. Initsialiseerimata kogus saab kasutada ainult EXISTS funktsioone .EXISTS(elemendi_positsioon)
COUNT Annab kogus olevate elementide koguarvu .COUNT
LIMIT See tagastab kogu maksimaalse suuruse. Varray puhul tagastab see määratud fikseeritud suuruse. Pesastatud tabeli ja tabelipõhise indeksite puhul annab see NULL-i .LIIT
ESIMESE Tagastab kogude esimese indeksimuutuja (alamindeksi) väärtuse .ESIMESE
VIIMASE Tagastab kogude viimase indeksimuutuja (alamindeksi) väärtuse .VIIMANE
EELMINE (n) Tagastamine eelneb indeksi muutujale n-i kogusth element. Kui eelnevat indeksi väärtust pole, tagastatakse NULL .PRIOR(n)
JÄRGMINE (n) Tagastab õnnestunud indeksi muutuja n-i kogusth element. Kui ei õnnestu, tagastatakse indeksi väärtus NULL .NEXT(n)
LAIENDA Laiendab lõpus ühte elementi kogus .LIKENDADA
LIKENDADA (n) Laiendab kogu lõppu n elementi .EXTEND(n)
LIKENDADA (n,i) Pikendab i koopiatth element kollektsiooni lõpus .EXTEND(n,i)
TRIM Eemaldab kollektsiooni lõpust ühe elemendi .TRIM
KÄRBI (n) Eemaldab kogumise lõpust n elementi .TRIM (n)
Kustuta Kustutab kogust kõik elemendid. Teeb kogu tühjaks .DELETE
KUSTUTA (n) Kustutab kogust n-nda elemendi. Kui nth element on NULL, siis see ei tee midagi .DELETE(n)
KUSTUTA (m,n) Kustutab elemendi vahemikus mth see nth kollektsioonis .DELETE(m,n)

Näide1: Kirje tüüp alamprogrammi tasemel

Selles näites näeme, kuidas täita kogu kasutades "HULTEKOGUja kuidas kogumisandmetele viidata.

Kirje tüüp alamprogrammi tasemel

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

Koodi selgitus:

  • Koodirida 2-8: Kirje tüüp 'emp_det' on deklareeritud veergudega emp_no, emp_name, palk ja andmetüübi NUMBER, VARCHAR2, NUMBER, NUMBER haldur.
  • Koodirida 9: Kirjetüübi elemendi 'emp_det' kogu 'emp_det_tbl' loomine
  • Koodirida 10: Muutuja 'guru99_emp_rec' deklareerimine tüübiks 'emp_det_tbl' ja lähtestamine nullkonstruktoriga.
  • Koodirida 12–15: Näidisandmete sisestamine tabelisse 'emp'.
  • Koodirida 16: Lisatehingu sooritamine.
  • Koodirida 17: Kirjete toomine tabelist 'emp' ja kogumuutuja sisestamine hulgi, kasutades käsku "BULK COLLECT". Nüüd sisaldab muutuja 'guru99_emp_rec' kõiki kirjeid, mis on tabelis 'emp'.
  • Koodirida 19–26: Silmuse FOR seadistamine, et printida kõik kogus olevad kirjed ükshaaval. Kogumismeetodit FIRST ja LAST kasutatakse alam- ja ülempiirina silmus.

Väljund: Nagu näete ülaltoodud ekraanipildil, saate ülaltoodud koodi käivitamisel järgmise väljundi

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

Võta see postitus kokku järgmiselt: