Oracle PL/SQL-kokoelmat: Varrayt, sisäkkäiset ja hakemistot taulukoiden mukaan

⚡ Älykäs yhteenveto

PL/SQL-kokoelmat ovat saman tietotyypin elementtien järjestettyjä ryhmiä, joihin kutakin tavoittaa alaindeksi. Kolme tyyppiä – Varray, sisäkkäinen taulukko ja indeksoitu taulukko – eroavat toisistaan ​​sen suhteen, onko niiden koko kiinteä, miten alaindeksi toimii ja voidaanko ne tallentaa tietokantaan.

  • 🧺 Määritelmä: Kokoelma sisältää useita saman tyyppisiä elementtejä, joista jokaisella on oma alaindeksinsä.
  • 📐 Varray: Kiinteä yläkoko, aina tiheä, numeerinen alaindeksi, on alustettava ennen käyttöä.
  • 📚 Sisäkkäinen taulukko: Ei kokorajoitusta, voi olla tiheä tai harva, tallennetaan järjestelmätaulukkoon, laajennetaan EXTEND-metodilla.
  • 🔑 Hakemisto taulukon mukaan: Ei kokorajoitusta, alaindeksi voi olla merkkijono tai negatiivinen kokonaisluku, ei tallenneta tietokantaan.
  • 🏗️ Rakentaja: Varray ja sisäkkäiset taulukot tarvitsevat eksplisiittisen konstruktorin alustusta varten ennen viittausta.
  • 🛠️ Menetelmät: COUNT, EXISTS, FIRST, LAST, EXTEND, TRIM ja DELETE hallitsevat kokoelmaa.
  • Bulk: BULK COLLECT täyttää kokoelman yhdellä vaiheella nopeaa käsittelyä varten.

Oracle PL/SQL-kokoelmat

Mikä on kokoelma?

Kokoelma on tietyn tietotyypin elementtien järjestetty ryhmä. Se voi olla yksinkertaisen tietotyypin tai monimutkaisen tietotyypin, kuten käyttäjän määrittämien tai tietuetyyppien, kokoelma.

Kokoelmassa jokainen elementti tunnistetaan termillä, jota kutsutaan nimellä "alaindeksi." Jokaiselle alkiolle on määritetty yksilöllinen alaindeksi, ja tietoja voidaan käsitellä tai noutaa viittaamalla kyseiseen yksilölliseen alaindeksiin.

Kokoelmat ovat hyödyllisimpiä silloin, kun on käsiteltävä tai muokattava suuri määrä samantyyppistä dataa. Kokoelmia voidaan täyttää ja muokata kokonaisuutena käyttämällä 'BULK'-vaihtoehtoa kohdassa Oracle.

Kokoelmat luokitellaan rakenteen, alaindeksin ja tallennustilan perusteella alla olevan mukaisesti:

  • Indeksipohjaiset taulukot (tunnetaan myös assosiatiivisina taulukoina)
  • Sisäkkäiset pöydät
  • Varrays

Kokoelman tietoihin voidaan milloin tahansa viitata kolmella termillä: kokoelman nimi, alaindeksi ja kentän tai sarakkeen nimi, kuten " ( ). ". Opit näistä kokoelmakategorioista alla olevissa osioissa.

Kokoelmatyypit yhdellä silmäyksellä

Kolmella kokoelmatyypillä on omat kompromissinsa. Alla olevassa taulukossa ne on rinnakkain ennen kuin kutakin käsitellään yksityiskohtaisesti.

Aspect Varray Sisäkkäinen taulukko Hakemisto taulukon mukaan
Koko Kiinteä yläraja Ei rajoitusta Ei rajoitusta
alaindeksi Numeerinen Numeerinen Kokonaisluku tai merkkijono
Tiheys Aina tiheä Tiheä vai harva Aina harva
Tallennettu tietokantaan Kyllä Kyllä Ei
Tarvitsee alustuksen Kyllä Kyllä Ei

Varrays

Varray on joukko, jonka taulukon koko on kiinteä eikä sitä voida ylittää. Varrayn alaindeksi on numeerinen arvo. Varraysin attribuutit ovat:

  • Ylärajakoko on kiinteä.
  • Täytetty peräkkäin alkaen alaindeksistä '1'.
  • Tämä kokoelmatyyppi on aina tiheä; emme voi poistaa yksittäisiä taulukon alkioita. Varray voidaan poistaa kokonaisuudessaan tai karsia lopusta.
  • Koska se on aina tiheää, sillä on hyvin vähän joustavuutta.
  • On tarkoituksenmukaisempaa, kun taulukon koko tunnetaan ja kaikille elementeille suoritetaan samanlaisia ​​toimintoja.
  • Kokoelman alaindeksi ja lukumäärä pysyvät aina vakaina.
  • Se on alustettava ennen käyttöä. Kaikki muut toiminnot paitsi EXISTS alustamattomalle kokoelmalle aiheuttavat virheen.
  • Se voidaan luoda tietokantaobjektina, joka näkyy koko tietokannassa, tai aliohjelman sisällä käytettäväksi vain siellä.

Alla oleva kuva selittää Varrayn (tiheän) muistin allokoinnin.

alaindeksi 1 2 3 4 5 6 7
Arvo xyz Dfv Sde Cxs Vbc Nhu Qwe

Syntaksi sanalle VARRAY:

TYPE <type_name> IS VARRAY (<SIZE>) OF <DATA_TYPE>;
  • Yllä olevassa syntaksissa tyypin_nimi on ilmoitettu VARRAY-muuttujana, jonka tyyppi on 'DATA_TYPE' annetulla kokorajoituksella. Tietotyyppi voi olla joko yksinkertainen tai kompleksinen.

Sisäkkäiset taulukot

Sisäkkäinen taulukko on kokoelma, jossa taulukon koko ei ole kiinteä. Sillä on numeerinen alaindeksityyppi. Lisätietoja sisäkkäisen taulukon tyypistä:

  • Sisäkkäisellä taulukolla ei ole ylärajaa.
  • Koska ylärajaa ei ole kiinteä, muistia on laajennettava joka kerta ennen käyttöä käyttämällä avainsanaa 'EXTEND'.
  • Täytetty peräkkäin alkaen alaindeksistä '1'.
  • Tämä kokoelmatyyppi voi olla sekä tiheä ja harva; voimme luoda sen tiheänä ja myös poistaa yksittäisiä elementtejä satunnaisesti, mikä tekee siitä harvan.
  • Se antaa enemmän joustavuutta taulukon alkioiden poistamiseen.
  • Se tallennetaan järjestelmän luomaan tietokantataulukkoon ja sitä voidaan käyttää valintakyselyssä arvojen hakemiseen.
  • Alaindeksi ja lukumäärä voivat vaihdella.
  • Se on alustettava ennen käyttöä. Kaikki muut toiminnot paitsi EXISTS alustamattomalle kokoelmalle aiheuttavat virheen.
  • Se voidaan luoda tietokantaobjektina, joka näkyy koko tietokannassa, tai aliohjelman sisällä käytettäväksi vain siellä.

Alla oleva kuva selittää sisäkkäisen taulukon muistin allokoinnin (tiheä ja harva). Tyhjä elementtitila tarkoittaa harvaa elementtiä.

alaindeksi 1 2 3 4 5 6 7
Arvo (tiheä) xyz Dfv Sde Cxs Vbc Nhu Qwe
Arvo (harva) Qwe asd Afg asd Wer

Sisäkkäisen taulukon syntaksi:

TYPE <type_name> IS TABLE OF <DATA_TYPE>;
  • Yllä olevassa syntaksissa tyypin_nimi on määritelty sisäkkäiseksi taulukkokokoelmaksi, jonka tyyppi on 'DATA_TYPE'. Tietotyyppi voi olla joko yksinkertainen tai monimutkainen.

Hakemisto taulukon mukaan

Indeksitaulukko on kokoelma, jonka taulukon koko ei ole kiinteä. Toisin kuin muissa kokoelmatyypeissä, käyttäjä voi määrittää indeksitaulukon alaindeksin. Indeksitaulukon ominaisuudet ovat:

  • Alaindeksi voi olla kokonaisluku tai merkkijono. Alaindeksin tyyppi tulee mainita kokoelmaa luotaessa.
  • Näitä kokoelmia ei tallenneta peräkkäin.
  • Luonteeltaan niitä on aina vähän.
  • Taulukon koko ei ole kiinteä.
  • Niitä ei voida tallentaa tietokannan sarakkeeseen. Ne luodaan ja niitä käytetään tietyn istunnon sisällä.
  • Ne antavat enemmän joustavuutta alaindeksin ylläpidossa.
  • Alaindeksit voivat olla negatiivinen sarja.
  • Ne sopivat paremmin suhteellisen pienemmille kokoelma-arvoille, joita käytetään samassa aliohjelmassa.
  • Niitä ei tarvitse alustaa ennen käyttöä.
  • Niitä ei voida luoda tietokantaobjekteina; ne luodaan vain aliohjelman sisällä.
  • BULK COLLECT -funktiota ei voi käyttää tämän kokoelmatyypin kanssa, koska alaindeksi on annettava erikseen jokaiselle tietueelle.

Alla oleva kuva selittää indeksoidun taulukon (harvan) muistin allokoinnin. Tyhjä elementtitila tarkoittaa harvaa elementtiä.

Alaindeksi (varchar) ENSIMMÄINEN TOINEN KOLMAS NELJÄS VIIDES KUUDES Seitsemäs
Arvo (harva) Qwe asd Afg asd Wer

Indeksitaulukon syntaksi:

TYPE <type_name> IS TABLE OF <DATA_TYPE> INDEX BY VARCHAR2 (10);
  • Yllä olevassa syntaksissa type_name on määritelty indeksien mukaiseksi taulukkokokoelmaksi, jonka tyyppi on 'DATA_TYPE'. Alaindeksimuuttuja on VARCHAR2-tyyppinen ja sen enimmäiskoko on 10.

Rakentaja ja alustuskonsepti kokoelmissa

Konstruktorit ovat sisäänrakennettuja funktioita, jotka tarjoavat Oracle joilla on sama nimi kuin objektilla tai kokoelmalla. Ne suoritetaan ensin aina, kun objektiin tai kokoelmaan viitataan ensimmäistä kertaa istunnon aikana. Tärkeitä tietoja konstruktorista kokoelmakontekstissa:

  • Kokoelmien tapauksessa näitä konstruktoreita on kutsuttava eksplisiittisesti kokoelman alustamiseksi.
  • Sekä Varray- että sisäkkäiset taulukot on alustettava näiden konstruktorien kautta ennen kuin niihin viitataan ohjelmassa.
  • Konstruktori laajentaa implisiittisesti kokoelman muistinvarausta (Varrayta lukuun ottamatta), joten se voi myös liittää kokoelmaan muuttujia.
  • Arvojen määrittäminen konstruktorien kautta ei koskaan tee kokoelmasta harvaa.

Keräysmenetelmät

Oracle tarjoaa useita funktioita kokoelmien käsittelyyn ja manipulointiin. Nämä funktiot määrittävät ja muokkaavat kokoelman eri ominaisuuksia. Alla olevassa taulukossa on esitetty eri funktiot ja niiden kuvaukset.

Menetelmä Tuotetiedot Syntaksi
OLEMASSA (n) Palauttaa totuusarvon. Palauttaa arvon TRUE, jos n:s elementti on olemassa, muuten FALSE. Vain EXISTS-arvoa voidaan käyttää alustamattomassa kokoelmassa. .EXISTS(element_position)
COUNT Antaa kokoelmassa olevien elementtien kokonaismäärän. .KREIVI
RAJOITA Palauttaa kokoelman enimmäiskoon. Varrayn tapauksessa palauttaa kiinteän koon; sisäkkäisten ja indeksoitujen taulukoiden tapauksessa palauttaa NULL-arvon. .RAJA
ENSIMMÄINEN Palauttaa kokoelman ensimmäisen alaindeksin arvon. .ENSIMMÄINEN
LAST Palauttaa kokoelman viimeisen alaindeksin arvon. .KESTÄÄ
EDELLINEN (n) Palauttaa n:nnen elementin edeltävän alaindeksin. Jos ei ole, palautetaan NULL. .PRIOR(n)
SEURAAVA (n) Palauttaa n:nnen elementin seuraavan alaindeksin. Jos ei ole, palautetaan NULL. .NEXT(n)
LAAJENNA Laajentaa yhtä elementtiä kokoelman lopussa. .EXTEND
LAAJENNA (n) Laajentaa n elementtiä kokoelman lopussa. .EXTEND(n)
LAAJENNA (n,i) Laajentaa i:nnen elementin n kopiota kokoelman lopussa. .EXTEND(n,i)
TRIM Poistaa yhden elementin kokoelman lopusta. .TRIMMATA
TRIM (n) Poistaa n elementtiä kokoelman lopusta. .TRIM (n)
POISTA Poistaa kaikki elementit kokoelmasta, jolloin siitä tulee tyhjä. .POISTAA
POISTA (n) Poistaa n:nnen elementin. Jos n:s elementti on NULL, ei tapahdu mitään. .DELETE(n)
POISTA (m,n) Poistaa kokoelmasta elementit väliltä mth - nth. .DELETE(m,n)

Esimerkki 1: Tietuetyyppi aliohjelmatasolla

Tässä esimerkissä näemme, miten kokoelma täytetään käyttämällä 'bulkkikeräys' ja miten kokoelmatietoihin viitataan.

PL/SQL-kokoelma, jossa on BULK COLLECT -esimerkki

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 Selitys

  • Code rivi 2–8: Tietueen tyyppi 'emp_det' deklaroidaan sarakkeilla emp_no, emp_name, manager ja salary, joiden tietotyypit ovat NUMBER, VARCHAR2, NUMBER ja NUMBER.
  • Code rivi 9: Luodaan kokoelmaa 'emp_det_tbl', jonka tietuetyyppielementti on 'emp_det'.
  • Code rivi 10: Muuttujan 'guru99_emp_rec' määrittäminen tyypiksi 'emp_det_tbl' ja sen alustaminen null-konstruktorilla.
  • Code rivi 12–15: Näytetietojen lisääminen 'emp'-taulukkoon.
  • Code rivi 16: Sisältötapahtuman sitominen.
  • Code rivi 17: Noudetaan tietueet 'emp'-taulukosta ja täytetään kokoelma-muuttuja joukkona käyttämällä ”BULK COLLECT” -metodia. Muuttuja 'guru99_emp_rec' sisältää nyt kaikki 'emp'-taulukossa olevat tietueet.
  • Code rivi 19–26: Asetetaan 'FOR'-silmukka tulostamaan kaikki kokoelman tietueet yksi kerrallaan. Keräysmetodeja FIRST ja LAST käytetään kokoelman ala- ja ylärajoina. silmukka.

lähtö: Kun yllä oleva koodi suoritetaan, saat seuraavan tulosteen.

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

UKK

Varraylla on kiinteä yläraja ja se on aina tiheä. Sisäkkäisellä taulukolla ei ole kokorajoitusta, se voi olla harva ja sitä voidaan laajentaa, mikä tekee siitä joustavamman kasvavan tai auki olevan datan käsittelyssä.

Koska kyseessä on muistissa oleva assosiatiivinen taulukko, ei tallennettu taulukko, alaindeksi toimii hakuavaimena, joten merkkijono tai negatiivinen kokonaisluku toimii, mikä on hyödyllistä istunnon sisällä tehtävissä avaimilla varustetuissa hauissa.

Alustamaton Varray tai sisäkkäinen taulukko on atomaarisesti null, joten elementtiin viittaaminen aiheuttaa virheen. Konstruktorin kutsu allokoi sen, minkä jälkeen EXTEND ja sijoitukset voivat lisätä dataa.

Kyllä. Jos koko on kiinteä, data on tallennettuna ja tarvitaanko merkkijonoavainta, tekoäly voi osoittaa Varray-taulukkoon, sisäkkäiseen taulukkoon tai indeksoituun taulukkoon ja selittää kompromissin.

BULK COLLECT lataa kaikki rivit kokoelmaan yhdellä kontekstivaihdolla SQL- ja PL/SQL-moottoreiden välillä yhden vaihdon sijaan riviä kohden, mikä vähentää huomattavasti suurten tulosjoukkojen työmäärää.

Tiivistä tämä viesti seuraavasti: