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