Oracle PL / SQL-kokoelmat: Varrays, Nested & Hakemisto taulukoiden mukaan

Sisällysluettelo:

Anonim

Mikä on kokoelma?

Kokoelma on järjestetty ryhmä tietyntyyppisiä elementtejä. Se voi olla kokoelma yksinkertaisia ​​tietotyyppejä tai monimutkaisia ​​tietotyyppejä (kuten käyttäjän määrittelemät tai tietuetyypit).

Kokoelmassa kukin elementti tunnistetaan termillä, jota kutsutaan "alaindeksiksi". Jokaiselle kokoelman kohteelle on määritetty yksilöllinen alaindeksi. Kokoelman tietoja voidaan käsitellä tai hakea viittaamalla kyseiseen ainutlaatuiseen alaindeksiin.

Kokoelmat ovat hyödyllisimpiä asioita, kun suurta samaa tyyppiä olevaa dataa on käsiteltävä tai käsiteltävä. Kokoelmat voidaan täyttää ja käsitellä kokonaisuutena käyttämällä Oracle-sovelluksen 'BULK' -vaihtoehtoa.

Tässä opetusohjelmassa opit-

  • Mikä on kokoelma?
  • Varrays
  • Sisäkkäiset taulukot
  • Hakemisto taulukoittain
  • Rakentaja- ja alustuskonsepti kokoelmissa
  • Keräysmenetelmät

Kokoelmat luokitellaan rakenteen, alaindeksin ja tallennustilan perusteella alla esitetyllä tavalla.

  • Hakemisto taulukoittain (tunnetaan myös nimellä Associative Array)
  • Sisäkkäiset taulukot
  • Varrays

Milloin tahansa kokoelman tietoihin voidaan viitata kolmella termillä Kokoelman nimi, Alaindeksi, Kentän / Sarakkeen nimi nimellä " (). ". Opit näistä yllä mainituista kokoelmaluokista tarkemmin alla olevasta osiosta.

Varrays

Varray on keräysmenetelmä, jossa matriisin koko on kiinteä. Taulukon kokoa ei voi ylittää sen kiinteää arvoa. Varrayn alaindeksi on numeerinen. Seuraavassa on Varraysin määritteet.

  • Ylärajan koko on kiinteä
  • Asutetaan peräkkäin alaindeksillä '1'
  • Tämä kokoelmatyyppi on aina tiheä, ts. Emme voi poistaa mitään taulukkoelementtejä. Varray voidaan poistaa kokonaisuutena tai se voidaan leikata loppuun asti.
  • 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, ts. Kokoelman alaindeksi ja määrä ovat aina samat.
  • Ne on alustettava ennen kuin niitä käytetään ohjelmissa. Kaikki alustamattoman kokoelman toiminnot (paitsi OLEMASSA olevat toiminnot) aiheuttavat virheen.
  • Se voidaan luoda tietokantaobjektina, joka näkyy koko tietokannassa tai alaohjelman sisällä ja jota voidaan käyttää vain kyseisessä alaohjelmassa.

Seuraava kuva selittää Varrayn (tiheä) muistin allokoinnin kaavamaisesti.

Alaindeksi 1 2 3 4 5 6 7
Arvo Xyz Dfv Sde Cxs Vbc Nhu Qwe

Syntaksi VARRAY: lle:

TYPE  IS VARRAY () OF ;
  • Edellä olevassa syntaksissa type_name ilmoitetaan tyypin DATA_TYPE VARRAY määritetylle kokorajoitukselle. Tietotyyppi voi olla joko yksinkertainen tai monimutkainen.

Sisäkkäiset taulukot

Sisäkkäinen taulukko on kokoelma, jossa taulukon kokoa ei ole määritetty. Sillä on numeerinen alaindeksityyppi. Alla on lisää kuvauksia sisäkkäisistä taulukotyypeistä.

  • Sisäkkäisessä taulukossa ei ole ylärajaa.
  • Koska koon ylärajaa ei ole vahvistettu, kokoelmaa, muistia on laajennettava joka kerta ennen kuin sitä käytetään. Voimme laajentaa kokoelmaa käyttämällä EXTEND-avainsanaa.
  • Asutetaan peräkkäin alaindeksillä '1'.
  • Tämä kokoelmatyyppi voi olla sekä tiheä että harva , eli voimme luoda kokoelman tiheäksi ja voimme myös poistaa yksittäisen taulukkoelementin satunnaisesti, mikä tekee siitä niin harvan.
  • Se antaa enemmän joustavuutta taulukkoelementin poistamisessa.
  • Se on tallennettu järjestelmän luomaan tietokantataulukkoon, ja sitä voidaan käyttää valintakyselyssä arvojen noutamiseen.
  • Alaindeksi ja sekvenssi eivät ole vakaita, ts. Alaindeksi ja taulukkoelementin määrä voivat vaihdella.
  • Ne on alustettava ennen kuin niitä käytetään ohjelmissa. Kaikki alustamattoman kokoelman toiminnot (paitsi OLEMASSA olevat toiminnot) aiheuttavat virheen.
  • Se voidaan luoda tietokantaobjektina, joka näkyy koko tietokannassa tai alaohjelman sisällä ja jota voidaan käyttää vain kyseisessä alaohjelmassa.

Seuraava kuva selittää sisäkkäisen taulukon (tiheä ja harva) muistin allokoinnin kaavamaisesti. Mustan värinen elementtitila merkitsee 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äin sisäkkäisen taulukon syntaksi:

TYPE  IS TABLE OF ;
  • Edellä olevassa syntaksissa type_name ilmoitetaan sisäkkäisiksi taulukkokokoelmiksi, joiden tyyppi on DATA_TYPE. Tietotyyppi voi olla joko yksinkertainen tai monimutkainen.

Hakemisto taulukoittain

Hakemisto taulukoittain on kokoelma, jossa taulukon kokoa ei ole määritetty. Toisin kuin muut kokoelmatyypit, käyttäjä voi määrittää alaindeksikohtaisessa kokoelmassa alaindeksin. Seuraavassa luetellaan hakemistokohtaiset attribuutit.

  • Alaindeksi voi olla kokonaisluku tai merkkijono. Kokoelman luomisen yhteydessä on mainittava alaindeksityyppi.
  • Näitä kokoelmia ei tallenneta peräkkäin.
  • Ne ovat luonteeltaan aina harvinaisia.
  • Taulukon kokoa ei ole vahvistettu.
  • Niitä ei voida tallentaa tietokannan sarakkeeseen. Ne on luotava ja käytettävä missä tahansa ohjelmassa kyseisessä istunnossa.
  • Ne antavat enemmän joustavuutta alaindeksin ylläpitämisessä.
  • Alaindeksit voivat olla myös negatiivisia alaindeksisekvenssejä.
  • Niitä on tarkoituksenmukaisempaa käyttää suhteellisen pienissä kollektiivisissa arvoissa, joissa kokoelma voidaan alustaa ja käyttää samoissa alaohjelmissa.
  • Niitä ei tarvitse alustaa ennen kuin aloitat niiden käytön.
  • Sitä ei voida luoda tietokantaobjektina. Se voidaan luoda vain alaohjelman sisällä, jota voidaan käyttää vain kyseisessä alaohjelmassa.
  • BULK COLLECT -ohjelmaa ei voida käyttää tässä kokoelmatyypissä, koska alaindeksi on annettava erikseen jokaiselle kokoelman tietueelle.

Seuraava kuva selittää sisäkkäisen taulukon (harva) muistin allokoinnin kaavamaisesti. Mustan värinen elementtitila merkitsee kokoelman tyhjää elementtiä eli harvaa.

Alaindeksi (varchar) ENSIMMÄINEN TOINEN KOLMAS NELJÄS VIIDES KUUDES SEITTÄS
Arvo (harva) Qwe Asd Afg Asd Wer

Syntaksi hakemistokohtaisesti

TYPE  IS TABLE OF  INDEX BY VARCHAR2 (10);
  • Edellä olevassa syntaksissa type_name ilmoitetaan hakemistokohtaisena kokoelmana, jonka tyyppi on DATA_TYPE. Tietotyyppi voi olla joko yksinkertainen tai monimutkainen. Subsciprt / index-muuttuja annetaan VARCHAR2-tyypinä ja maksimikoko 10.

Rakentaja- ja alustuskonsepti kokoelmissa

Rakentajat ovat sisäänrakennettu toiminto, jonka tarjoaa oraakkeli, jolla on sama nimi kuin objektilla tai kokoelmilla. Ne suoritetaan ensin, kun esine tai kokoelmat lähetetään ensimmäistä kertaa istunnossa. Alla on tärkeitä yksityiskohtia rakentajasta kokoelmakontekstissa:

  • Kokoelmia varten nämä rakentajat tulisi kutsua nimenomaisesti alustamaan se.
  • Sekä Varray- että Nested-taulukot on alustettava näiden rakentajien kautta, ennen kuin ne ohjataan ohjelmaan.
  • Rakentaja laajentaa implisiittisesti muistin allokointia kokoelmalle (paitsi Varray), joten rakentaja voi myös määrittää muuttujat kokoelmille.
  • Arvojen osoittaminen kokoelmalle rakentajien kautta ei koskaan tee kokoelmasta harvaa.

Keräysmenetelmät

Oracle tarjoaa monia toimintoja kokoelmien käsittelyyn ja käsittelyyn. Nämä toiminnot ovat erittäin hyödyllisiä ohjelmassa kokoelmien eri määritteiden määrittämiseksi ja muokkaamiseksi. Seuraavassa taulukossa esitetään eri toiminnot ja niiden kuvaus.

Menetelmä Kuvaus SYNTAKSI
OLEMASSA (n) Tämä menetelmä palauttaa Boolen tulokset. Se palautuu 'TOSI', jos n : nnen elementin olemassa, että kokoelma, muuten se palaa EPÄTOSI. Ainoastaan ​​EXISTS-toimintoja voidaan käyttää alustamattomassa kokoelmassa .EXISTS (element_position)
KREIVI Antaa kokoelmassa olevien elementtien kokonaismäärän .COUNT
RAJA Se palauttaa kokoelman enimmäiskoon. Varraylle se palauttaa määritetyn kiinteän koon. Sisäkkäisille taulukoille ja hakemistokohtaisesti se antaa NULL .LIMIT
ENSIMMÄINEN Palauttaa kokoelmien ensimmäisen indeksimuuttujan (alaindeksin) arvon . ENSIMMÄINEN
KESTÄÄ Palauttaa kokoelmien viimeisen hakemistomuuttujan (alaindeksin) arvon . VIIMEINEN
ENNEN (n) Palauttaa indeksimuuttujan ennen n: nnen elementin kokoelmaa . Jos indeksin edeltävää arvoa ei ole, NULL palautetaan . ENNEN (n)
SEURAAVA (n) Tuotto onnistuu indeksi muuttujan kokoelma n : nnen elementin. Jos onnistuneita hakemistoja ei ole, NULL palautetaan . SEURAAVA (n)
LAAJENNA Laajentaa yhden elementin kokoelmassa lopussa .EXTEND
Laajentaa (n) Laajentaa n elementtiä kokoelman lopussa .EXTEND (n)
LAAJENNA (n, i) Laajentaa n kopiota i : n elementistä kokoelman lopussa .EXTEND (n, i)
TRIMMATA Poistaa yhden elementin kokoelman päästä . TRIM
TRIM (n) Poistaa n elementtiä kokoelman lopusta . TRIM (n)
POISTAA Poistaa kaikki elementit kokoelmasta. Tekee kokoelman tyhjäksi . POISTA
POISTA (n) Poistaa n: nnen elementin kokoelmasta. Jos n : nnen elementti on tyhjä, niin tämä ei tee mitään . POISTA (n)
POISTA (m, n) Poistaa elementin alueella m : nnen ja n : nnen kokoelma . POISTA (m, n)

Esimerkki 1: Tietueen tyyppi aliohjelmatasolla

Tässä esimerkissä aiomme nähdä, kuinka kokoelma täytetään 'BULK COLLECT' -toiminnolla ja miten viitataan kokoelmatietoihin.

DECLARETYPE 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();BEGININSERT 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_recFROM emp;dbms_output.put_line (‘Employee Detail');FOR i IN guru99_emp_rec.FIRST… guru99_emp_rec.LASTLOOPdbms_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 : Tietuetyyppi 'emp_det' ilmoitetaan sarakkeilla emp_no, emp_name, palkka ja tietotyypin NUMBER, VARCHAR2, NUMBER, NUMBER ylläpitäjä.
  • Koodirivi 9: Tietuetyyppisen elementin 'emp_det' kokoelman 'emp_det_tbl' luominen
  • Koodirivi 10: Muuttujan 'guru99_emp_rec' julistaminen 'emp_det_tbl' -tyypiksi ja alustaminen tyhjärakentajalla.
  • Koodirivi 12-15: Lisää näytetiedot 'emp' -taulukkoon.
  • Koodirivi 16: Lisää tapahtuma.
  • Koodirivi 17: Tietueiden haku 'emp' -taulukosta ja kokoelmamuuttujan täyttäminen joukkona käyttämällä komentoa "BULK COLLECT". Muuttuja 'guru99_emp_rec' sisältää nyt kaikki tietueet, jotka ovat taulukossa 'emp'.
  • Koodirivi 19-26: 'FOR' -silmukan asettaminen tulostamalla kaikki kokoelman tietueet yksitellen. Keräysmenetelmää FIRST ja LAST käytetään silmukan ala- ja ylärajana.

Tulos : Kuten yllä olevasta kuvakaappauksesta näet, kun yllä oleva koodi suoritetaan, saat seuraavan tuloksen

Employee DetailEmployee Number: 1000Employee Name: AAAEmployee Salary: 25000Employee Manager Number: 1000----------------------------------------------Employee Number: 1001Employee Name: XXXEmployee Salary: 10000Employee Manager Number: 1000----------------------------------------------Employee Number: 1002Employee Name: YYYEmployee Salary: 15000Employee Manager Number: 1000----------------------------------------------Employee Number: 1003Employee Name: ZZZEmployee Salary: 7500Employee Manager Number: 1000----------------------------------------------