Oracle PL/SQL-kogud: Varrays, Pesastatud ja Indeks tabelite järgi
⚡ Nutikas kokkuvõte
PL/SQL-kollektsioonid on sama andmetüübi elementide järjestatud rühmad, millest igaühele pääseb ligi alaindeks. Kolm tüüpi – Varray, pesastatud tabel ja indekstabel – erinevad selle poolest, kas suurus on fikseeritud, kuidas alaindeks töötab ja kas neid saab andmebaasi salvestada.

Mis on kollektsioon?
Kogumik on teatud andmetüübi elementide järjestatud rühm. See võib olla lihtsa andmetüübi või keeruka andmetüübi (nt kasutaja määratletud või kirjetüübid) kogum.
Kollektsioonis on iga element tähistatud terminiga, mida nimetatakse a-ks. "allindeks." Igale üksusele on määratud unikaalne alaindeks ja andmeid saab selle unikaalse alaindeksa abil manipuleerida või hankida.
Kollektsioonid on kõige kasulikumad siis, kui on vaja töödelda või manipuleerida suures koguses sama tüüpi andmeid. Kollektsioonid saab tervikuna täita ja manipuleerida, kasutades valikut „BULK” jaotises. Oracle.
Kogud liigitatakse struktuuri, alaindeksi ja salvestusruumi alusel, nagu allpool näidatud:
- Indekseeritud tabelid (tuntud ka kui assotsiatiivsed massiivid)
- Pesastatud lauad
- Varrays
Kogumiku andmetele saab igal hetkel viidata kolme terminiga: kogumiku nimi, alaindeks ja välja- või veerunimi, näiteks „ ( ). ". Nende kogukategooriate kohta saate teada järgmistes osades.
Kollektsioonitüüpide ülevaade
Kolme kogumistüübi puhul on tegemist erinevate kompromissidega. Allolev tabel seab need enne üksikasjalikumat käsitlemist kõrvuti.
| Aspekt | Varray | Pesastatud tabel | Indeks tabelite kaupa |
|---|---|---|---|
| Mõõt | Fikseeritud ülempiir | Ühtegi piirmäära | Ühtegi piirmäära |
| indeks | Arv- | Arv- | Täisarv või string |
| Tihedus | Alati tihe | Tihe või hõre | Alati hõre |
| Salvestatud andmebaasis | Jah | Jah | Ei |
| Vajab initsialiseerimist | Jah | Jah | Ei |
Varrays
Varray on kogum, mille massiivi suurus on fikseeritud ja seda ei saa ületada. Varray alaindeks on numbriline väärtus. Varray atribuudid on:
- Ülemine piirsuurus on fikseeritud.
- Täidetakse järjestikku, alustades alaindeksist '1'.
- See kollektsioonitüüp on alati tihe; me ei saa üksikuid massiivi elemente kustutada. Varray saab kustutada tervikuna või otsast kärpida.
- Kuna see on alati tihe, on sellel väga vähe paindlikkust.
- See on sobivam, kui massiivi suurus on teada ja sarnaseid tegevusi tehakse kõigi elementide puhul.
- Kollektsiooni indeks ja arv jäävad alati stabiilseks.
- Enne kasutamist tuleb see initsialiseerida. Iga toiming peale EXISTS initsialiseerimata kollektsiooni puhul annab vea.
- Selle saab luua andmebaasiobjektina, mis on nähtav kogu andmebaasis, või alamprogrammi sees, et seda ainult seal kasutada.
Allolev joonis selgitab Varray (tiheda) mälu eraldamist.
| 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 deklareeritakse tüübi_nimi (type_name) muutujana VARRAY tüübiga 'DATA_TYPE' antud suuruspiirangu piires. Andmetüüp võib olla kas lihtne või keerukas.
Pesastatud tabelid
Pesastatud tabel on kogum, mille massiivi suurus pole fikseeritud. Sellel on numbriline alaindeksi tüüp. Lisateavet pesastatud tabeli tüübi kohta:
- Pesastatud tabelil ei ole ülemist suurusepiirangut.
- Kuna ülempiir pole fikseeritud, tuleb mälu iga kord enne kasutamist laiendada, kasutades märksõna 'EXTEND'.
- Täidetakse järjestikku, alustades alaindeksist '1'.
- See kogumistüüp võib olla mõlemat tüüpi tihe ja hõre; saame selle luua tihedana ja ka üksikuid elemente juhuslikult kustutada, mis muudab selle hõredaks.
- See annab massiivi elementide kustutamiseks suurema paindlikkuse.
- See salvestatakse süsteemi loodud andmebaasitabelisse ja seda saab kasutada valikupäringus väärtuste toomiseks.
- Alaindeks ja arv võivad erineda.
- Enne kasutamist tuleb see initsialiseerida. Iga toiming peale EXISTS initsialiseerimata kollektsiooni puhul annab vea.
- Selle saab luua andmebaasiobjektina, mis on nähtav kogu andmebaasis, või alamprogrammi sees, et seda ainult seal kasutada.
Allolev joonis selgitab pesastatud tabeli (tiheda ja hõreda) mälujaotust. Tühi elemendiruum tähistab hõredat elementi.
| 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 <type_name> IS TABLE OF <DATA_TYPE>;
- Ülaltoodud süntaksis deklareeritakse tüübi_nimi pesastatud tabelite kogumina tüübiga 'DATA_TYPE'. Andmetüüp võib olla kas lihtne või keerukas.
Indeks tabelite kaupa
Indekstabel on kollektsioon, mille massiivi suurus pole fikseeritud. Erinevalt teistest kollektsioonitüüpidest saab kasutaja indekstabeli alaindeksi määratleda. Indekstabeli atribuudid on järgmised:
- Alamindeks võib olla täisarv või string. Alamindeksi tüüp tuleks kollektsiooni loomisel mainida.
- Neid kogusid ei salvestata järjestikku.
- Looduses on nad alati hõredad.
- Massiivi suurus pole fikseeritud.
- Neid ei saa andmebaasi veergu salvestada. Need luuakse ja kasutatakse konkreetse seansi piires.
- Need pakuvad alamindeksi säilitamisel suuremat paindlikkust.
- Alaindeksid võivad olla negatiivsed järjestused.
- Need sobivad paremini suhteliselt väiksemate kogumiväärtuste jaoks, mida kasutatakse samas alamprogrammis.
- Neid ei pea enne kasutamist initsialiseerima.
- Neid ei saa luua andmebaasiobjektina; need luuakse ainult alamprogrammi sees.
- Funktsiooni BULK COLLECT ei saa selle kogumistüübiga kasutada, kuna iga kirje jaoks tuleb alaindeks selgesõnaliselt määrata.
Allolev joonis selgitab indekseeritud tabeli (hõreda tabeli) mälu eraldamist. Tühi elemendiruum tähistab hõredat elementi.
| Alamindeks (varchar) | ESIMESE | TEINE | KOLMAS | NELJAS | VIIES | KUUES | SEITSMES |
| Väärtus (hõre) | Qwe | Asd | Afg | Asd | Wer |
Indeksipõhise tabeli süntaks:
TYPE <type_name> IS TABLE OF <DATA_TYPE> INDEX BY VARCHAR2 (10);
- Ülaltoodud süntaksis deklareeritakse type_name indekseeritud tabelite kogumina tüübiga 'DATA_TYPE'. Alamindeksi muutuja on antud tüübina VARCHAR2, mille maksimaalne suurus on 10.
Konstruktor ja initsialiseerimise kontseptsioon kogudes
Konstruktorid on sisseehitatud funktsioonid, mida pakub Oracle millel on sama nimi kui objektil või kollektsioonil. Neid käivitatakse esimesena alati, kui objektile või kollektsioonile seansi jooksul esimest korda viidatakse. Konstruktori olulised üksikasjad kollektsiooni kontekstis:
- Kollektsioonide puhul tuleb neid konstruktoreid kollektsiooni initsialiseerimiseks selgesõnaliselt kutsuda.
- Nii Varray kui ka pesastatud tabelid tuleb enne programmis viitamist nende konstruktorite kaudu initsialiseerida.
- Konstruktor laiendab kaudselt kollektsiooni mälu eraldamist (välja arvatud Varray), nii et see saab kollektsioonile määrata ka muutujaid.
- Väärtuste määramine konstruktorite kaudu ei muuda kollektsiooni kunagi hõredaks.
Kogumismeetodid
Oracle pakub palju funktsioone kollektsioonide manipuleerimiseks ja nendega töötamiseks. Need funktsioonid määravad ja muudavad kollektsiooni erinevaid atribuute. Allolev tabel annab erinevad funktsioonid ja nende kirjeldused.
| Meetod | Kirjeldus | Süntaks |
|---|---|---|
| OLEMAS (n) | Tagastab Boole'i tulemuse. Tagastab TRUE, kui n-s element on olemas, vastasel juhul FALSE. Initsialiseerimata kollektsiooni puhul saab kasutada ainult EXISTS-i. | .EXISTS(elemendi_positsioon) |
| COUNT | Annab kollektsioonis esinevate elementide koguarvu. | .COUNT |
| LIMIT | Tagastab kollektsiooni maksimaalse suuruse. Varray puhul tagastab fikseeritud suuruse; pesastatud ja indekseeritud tabelite puhul tagastab NULL väärtuse. | .LIIT |
| ESIMESE | Tagastab kollektsiooni esimese alaindeksi väärtuse. | .ESIMESE |
| VIIMASE | Tagastab kollektsiooni viimase alaindeksi väärtuse. | .VIIMANE |
| EELMINE (n) | Tagastab n-nda elemendi eelneva alaindeksi. Kui seda pole, tagastatakse NULL. | .PRIOR(n) |
| JÄRGMINE (n) | Tagastab n-nda elemendi järgneva alaindeksi. Kui seda pole, tagastatakse NULL. | .NEXT(n) |
| LAIENDA | Laiendab ühte elementi kollektsiooni lõpus. | .LIKENDADA |
| LIKENDADA (n) | Laiendab kollektsiooni lõpus n elementi. | .EXTEND(n) |
| LIKENDADA (n,i) | Laiendab i-nda elemendi n koopiat kollektsiooni lõpus. | .EXTEND(n,i) |
| TRIM | Eemaldab kollektsiooni lõpust ühe elemendi. | .TRIM |
| KÄRBI (n) | Eemaldab kollektsiooni lõpust n elementi. | .TRIM (n) |
| Kustuta | Kustutab kollektsioonist kõik elemendid, muutes selle tühjaks. | .DELETE |
| KUSTUTA (n) | Kustutab n-nda elemendi. Kui n-s element on NULL, siis ei tee midagi. | .DELETE(n) |
| KUSTUTA (m,n) | Kustutab kollektsioonist elemendid vahemikus m-ndast kuni n-ndani. | .DELETE(m,n) |
Näide 1: Kirje tüüp alamprogrammi tasandil
Selles näites näeme, kuidas kollektsiooni täita, kasutades 'HULTEKOGU„ja kuidas kogumiandmetele viidata.“
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; /
Code Selgitus
- Code rida 2-8: Kirje tüüp 'emp_det' deklareeritakse veergudega emp_no, emp_name, manager ja salary andmetüüpidega NUMBER, VARCHAR2, NUMBER ja NUMBER.
- Code rida 9: Kirjetüübi elemendi 'emp_det' kollektsiooni 'emp_det_tbl' loomine.
- Code rida 10: Muutuja 'guru99_emp_rec' deklareerimine tüübiks 'emp_det_tbl' ja selle initsialiseerimine nullkonstruktoriga.
- Code rida 12-15: Näidisandmete sisestamine tabelisse 'emp'.
- Code rida 16: Lisatehingu sooritamine.
- Code rida 17: Kirjete toomine tabelist „emp” ja kollektsioonimuutuja täitmine hulgi, kasutades funktsiooni „BULK COLLECT”. Muutuja „guru99_emp_rec” sisaldab nüüd kõiki tabelis „emp” olevaid kirjeid.
- Code rida 19-26: 'FOR' tsükli seadistamine nii, et see prindiks kõik kollektsiooni kirjed ükshaaval välja. Kogumismeetodeid FIRST ja LAST kasutatakse alumise ja ülemise piirina. silmus.
Väljund: Kui ülaltoodud kood käivitatakse, saate 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 ----------------------------------------------

