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.

  • 🧺 Määratlus: Kogumik sisaldab palju ühte tüüpi elemente, millest igaüks on tähistatud unikaalse indeksiga.
  • 📐 Varray: Fikseeritud ülemine suurus, alati tihe, numbriline alaindeks, tuleb enne kasutamist initsialiseerida.
  • 📚 Pesastatud tabel: Suurusepiirangut pole, võib olla tihe või hõre, salvestatud süsteemitabelisse, laiendatud EXTEND-iga.
  • 🔑 Indeks tabelite kaupa: Suurusepiirangut pole, alaindeks võib olla string või negatiivne täisarv, seda ei salvestata andmebaasis.
  • 🏗️ Ehitaja: Varray ja pesastatud tabelid vajavad enne viitamist initsialiseerimiseks selgesõnalist konstruktorit.
  • 🛠️ Meetodid: Käsud COUNT, EXISTS, FIRST, LAST, EXTEND, TRIM ja DELETE haldavad kollektsiooni.
  • Mass: BULK COLLECT täidab kollektsiooni ühe sammuga kiireks töötlemiseks.

Oracle PL/SQL kogud

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

PL/SQL-kogum, mis on täidetud BULK COLLECT näitega

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

KKK

Varray tabelil on fikseeritud ülemine suurus ja see on alati tihe. Pesastatud tabelil pole suurusepiirangut, see võib olla hõre ja seda saab laiendada, mis muudab selle kasvavate või lünklike andmete korral paindlikumaks.

Kuna tegemist on mälus oleva assotsiatiivse massiiviga, mitte salvestatud tabeliga, toimib alaindeks otsinguvõtmena, seega töötab string või negatiivne täisarv, mis on kasulik seansi sees võtmega otsingute tegemiseks.

Initsialiseerimata Varray või pesastatud tabel on aatomiliselt null, seega elemendile viitamine tekitab vea. Konstruktori kutsumine eraldab selle, mille järel EXTEND ja omistamised saavad andmeid lisada.

Jah. Arvestades, kas suurus on fikseeritud, kas andmed on salvestatud ja kas stringivõtit on vaja, saab tehisintellekt osutada Varrayle, pesastatud tabelile või indekseeritud tabelile ja selgitada kompromissi.

BULK COLLECT laadib kõik read kollektsiooni ühe kontekstilülitiga SQL-i ja PL/SQL-mootorite vahel, selle asemel, et vahetada iga rea ​​kohta eraldi, mis vähendab oluliselt suurte tulemuskogumite üldkulu.

Võta see postitus kokku järgmiselt: