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

Mikä on Collection?

Kokoelma on tiettyjen tietotyyppien elementtien järjestetty ryhmä. Se voi olla kokoelma yksinkertaisia ​​tietotyyppejä tai monimutkaisia ​​tietotyyppejä (kuten käyttäjän määrittämiä tai tietuetyyppejä).

Kokoelmassa jokainen elementti tunnistetaan termillä nimeltä "alaindeksi." Jokaiselle kokoelman kohteelle on määritetty yksilöllinen alaindeksi. Kokoelman tietoja voidaan käsitellä tai hakea viittaamalla tähän ainutlaatuiseen alaindeksiin.

Kokoelmat ovat hyödyllisimpiä asioita, kun suuria samantyyppisiä tietoja on käsiteltävä tai käsiteltävä. Kokoelmia voidaan täyttää ja käsitellä kokonaisina käyttämällä BULK-vaihtoehtoa Oracle.

Kokoelmat luokitellaan rakenteen, alaindeksin ja tallennustilan perusteella alla olevan kuvan mukaisesti.

  • Indeksitaulukot (tunnetaan myös nimellä Associative Array)
  • Sisäkkäiset pöydät
  • Varrays

Kokoelman tietoihin voidaan viitata milloin tahansa kolmella termillä Kokoelman nimi, Alaindeksi, Kentän/Sarakkeen nimi " ( ). ”. Opit näistä edellä mainituista kokoelmaluokista tarkemmin alla olevassa osiossa.

Varrays

Varray on keräysmenetelmä, jossa taulukon koko on kiinteä. Taulukon kokoa ei voi ylittää sen kiinteää arvoa. Varrayn alaindeksi on numeerinen. Seuraavat ovat Varraysin attribuutit.

  • Ylärajakoko on kiinteä
  • Täytetty peräkkäin alaindeksillä '1' alkaen
  • Tämä kokoelmatyyppi on aina tiheä, eli emme voi poistaa taulukkoelementtejä. Varray voidaan poistaa kokonaisuudessaan tai leikata loppuun.
  • Koska se on aina luonteeltaan tiheä, sillä on hyvin vähemmän joustavuutta.
  • On tarkoituksenmukaisempaa käyttää, kun taulukon koko on tiedossa, ja suorittaa samanlaisia ​​toimintoja kaikille taulukon elementeille.
  • Alaindeksi ja järjestys pysyvät aina vakaina, eli kokoelman alaindeksi ja määrä ovat aina samat.
  • Ne on alustettava ennen niiden käyttöä ohjelmissa. Kaikki toiminnot (paitsi EXISTS-toiminto) alustamattomassa kokoelmassa aiheuttavat virheen.
  • Se voidaan luoda tietokantaobjektiksi, joka näkyy koko tietokannassa tai aliohjelman sisällä, jota voidaan käyttää vain kyseisessä aliohjelmassa.

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

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 määritetään tyypin 'DATA_TYPE' VARRAY:ksi annetulla kokorajoituksella. Tietotyyppi voi olla joko yksinkertainen tai monimutkainen.

Sisäkkäiset taulukot

Sisäkkäinen taulukko on kokoelma, jossa taulukon koko ei ole kiinteä. Siinä on numeerinen alaindeksityyppi. Alla on lisää kuvauksia sisäkkäisistä taulukkotyypeistä.

  • Sisäkkäisellä taulukolla ei ole yläkokorajoitusta.
  • Koska ylärajaa ei ole kiinteä, kokoelmaa, muistia on laajennettava joka kerta ennen kuin käytämme sitä. Voimme laajentaa kokoelmaa käyttämällä "EXTEND" avainsanaa.
  • Täytetty peräkkäin alaindeksillä '1' alkaen.
  • Tämä kokoelmatyyppi voi olla molempia tiheä ja harva, eli voimme luoda kokoelman tiheänä, ja voimme myös poistaa yksittäisen taulukon elementin satunnaisesti, mikä tekee siitä harvan.
  • Se antaa enemmän joustavuutta taulukkoelementin poistamiseen.
  • Se tallennetaan järjestelmän luomaan tietokantataulukkoon ja sitä voidaan käyttää valintakyselyssä arvojen hakemiseen.
  • Alaindeksi ja sekvenssi eivät ole vakaita, eli alaindeksi ja taulukkoelementin määrä voivat vaihdella.
  • Ne on alustettava ennen niiden käyttöä ohjelmissa. Kaikki toiminnot (paitsi EXISTS-toiminto) alustamattomassa kokoelmassa aiheuttavat virheen.
  • Se voidaan luoda tietokantaobjektiksi, joka näkyy koko tietokannassa tai aliohjelman sisällä, jota voidaan käyttää vain kyseisessä aliohjelmassa.

Alla olevassa kuvassa selitetään sisäkkäisen taulukon (tiheä ja harva) muistin varaus kaaviomaisesti. Musta värillinen elementtiavaruus tarkoittaa kokoelman tyhjää elementtiä eli harvaa.

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 <tvpe name> IS TABLE OF <DATA TYPE>;
  • Yllä olevassa syntaksissa tyypin_nimi ilmoitetaan sisäkkäiseksi taulukkokokoelmaksi, jonka tyyppi on DATA_TYPE. Tietotyyppi voi olla joko yksinkertainen tai monimutkainen.

Indeksi taulukoittain

Index-by-table on kokoelma, jossa taulukon koko ei ole kiinteä. Toisin kuin muissa kokoelmatyypeissä, indeksi-taulukko-kokoelmassa alaindeksi voi koostua käyttäjän määritellystä. Seuraavat ovat indeksi-taulukon attribuutit.

  • Alaindeksi voi koostua kokonaisluvuista tai merkkijonoista. 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 voi tallentaa tietokantararakkeeseen. Ne tulee luoda ja käyttää missä tahansa ohjelmassa kyseisen istunnon aikana.
  • Ne antavat enemmän joustavuutta alaindeksin ylläpitämisessä.
  • Alaindeksit voivat olla myös negatiivisessa järjestyksessä.
  • Niitä on tarkoituksenmukaisempi käyttää suhteellisen pienille kollektiivisille arvoille, joissa kokoelma voidaan alustaa ja käyttää samoissa aliohjelmissa.
  • Niitä ei tarvitse alustaa ennen käytön aloittamista.
  • Sitä ei voi luoda tietokantaobjektiksi. Se voidaan luoda vain aliohjelman sisällä, jota voidaan käyttää vain kyseisessä aliohjelmassa.
  • BULK COLLECTia ei voi käyttää tässä kokoelmatyypissä, koska alaindeksi on annettava erikseen jokaiselle kokoelman tietueelle.

Alla olevassa kuvassa selitetään sisäkkäisen taulukon (harva) muistin varaus kaaviomaisesti. Musta värillinen elementtiavaruus tarkoittaa kokoelman tyhjää elementtiä eli harvaa.

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

Hakemistotaulukon syntaksi

TYPE <type_name> IS TABLE OF <DATA_TYPE> INDEX BY VARCHAR2 (10);
  • Yllä olevassa syntaksissa tyypin_nimi on ilmoitettu hakemistokohtaiseksi kokoelmaksi, jonka tyyppi on DATA_TYPE. Tietotyyppi voi olla joko yksinkertainen tai monimutkainen. Subsciprt/index-muuttuja annetaan tyyppinä VARCHAR2, jonka enimmäiskoko on 10.

Rakentaja ja alustuskonsepti kokoelmissa

Rakentajat ovat oraakkelin tarjoama sisäänrakennettu toiminto, jolla on sama nimi kuin objektilla tai kokoelmilla. Ne suoritetaan ensin aina, kun objekti tai kokoelmat saavat viittauksen ensimmäistä kertaa istunnon aikana. Alla on tärkeitä rakentajan yksityiskohtia kokoelman kontekstissa:

  • Kokoelmien osalta nämä rakentajat tulisi kutsua nimenomaisesti niiden alustamiseksi.
  • Sekä Varray- että Nested-taulukot on alustettava näiden rakentajien kautta ennen kuin ne ohjataan ohjelmaan.
  • Constructor laajentaa implisiittisesti kokoelman muistin varausta (paitsi Varray), joten konstruktori voi myös määrittää muuttujat kokoelmiin.
  • Arvojen antaminen kokoelmalle rakentajien kautta ei koskaan tee kokoelmasta harvaa.

Keräysmenetelmät

Oracle tarjoaa monia toimintoja kokoelmien käsittelemiseen ja käsittelemiseen. Nämä toiminnot ovat erittäin hyödyllisiä ohjelmassa kokoelmien eri attribuuttien määrittämisessä ja muokkaamisessa. Seuraavassa taulukossa on eri toiminnot ja niiden kuvaus.

Menetelmä Tuotetiedot SYNTAKSI
OLEMASSA (n) Tämä menetelmä palauttaa Boolen tulokset. Se palauttaa arvon 'TRUE', jos nth elementti on olemassa kyseisessä kokoelmassa, muuten se palauttaa FALSE. Vain EXISTS-toimintoja voidaan käyttää alustamattomassa kokoelmassa .EXISTS(element_position)
COUNT Antaa kokoelmassa olevien elementtien kokonaismäärän .KREIVI
RAJOITA Se palauttaa kokoelman enimmäiskoon. Varraylle se palauttaa määritetyn kiinteän koon. Sisäkkäisille taulukoille ja hakemistotaulukoille se antaa NULL:n .RAJA
ENSIMMÄINEN Palauttaa aineistoluokkien ensimmäisen indeksimuuttujan (alaindeksin) arvon .ENSIMMÄINEN
LAST Palauttaa kokoelmien viimeisen indeksimuuttujan (alaindeksin) arvon .KESTÄÄ
EDELLINEN (n) Palauttaa edeltää indeksimuuttujan joukossa nth elementti. Jos ei ole edeltävää indeksiarvoa, palautetaan NULL .PRIOR(n)
SEURAAVA (n) Palauttaa onnistumisindeksimuuttujan n kokoelmassath elementti. Jos ei ole onnistunut indeksiarvo NULL palautetaan .NEXT(n)
LAAJENNA Laajentaa yhden elementin kokoelmassa lopussa .EXTEND
LAAJENNA (n) Laajentaa n elementtiä kokoelman lopussa .EXTEND(n)
LAAJENNA (n,i) Laajentaa n kopiota i:stäth elementti 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. Tekee kokoelman tyhjäksi .POISTAA
POISTA (n) Poistaa n:nnen elementin kokoelmasta. Jos sittenth elementti on NULL, tämä ei tee mitään .DELETE(n)
POISTA (m,n) Poistaa elementin alueella mth tämä nth kokoelmassa .DELETE(m,n)

Esimerkki1: Tietueen tyyppi aliohjelmatasolla

Tässä esimerkissä aiomme nähdä, kuinka kokoelma täytetään käyttämällä "bulkkikeräysja miten kokoelmatietoihin viitataan.

Tietueen tyyppi aliohjelmatasolla

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

Koodin selitys:

  • Koodirivi 2-8: Tietueen tyyppi 'emp_det' ilmoitetaan sarakkeilla emp_no, emp_name, palkka ja tietotyypin NUMBER, VARCHAR2, NUMBER, NUMBER johtaja.
  • Koodirivi 9: Tietuetyyppielementin 'emp_det' kokoelman 'emp_det_tbl' luominen
  • Koodirivi 10: Määritetään muuttuja 'guru99_emp_rec' tyypiksi 'emp_det_tbl' ja alustetaan null-konstruktorilla.
  • Koodirivit 12-15: Näytetietojen lisääminen 'emp'-taulukkoon.
  • Koodirivi 16: Sisältötapahtuman sitominen.
  • Koodirivi 17: Tietueiden hakeminen 'emp'-taulukosta ja kokoelmamuuttujan täyttäminen joukkona komennolla "BULK COLLECT". Nyt muuttuja 'guru99_emp_rec' sisältää kaikki tietueet, jotka ovat taulukossa 'emp'.
  • Koodirivit 19-26: FOR-silmukan asettaminen käyttämällä tulostaaksesi kaikki kokoelman tietueet yksitellen. Keräysmenetelmää FIRST ja LAST käytetään ala- ja ylärajana silmukka.

ulostulo: Kuten yllä olevassa kuvakaappauksessa näet, 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
----------------------------------------------