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.

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

