Oracle PL/SQL-samlinger: Varrays, Nested & Index by Tables
Hva er samling?
En samling er en ordnet gruppe elementer av bestemte datatyper. Det kan vรฆre en samling av enkel datatype eller kompleks datatype (som brukerdefinerte eller posttyper).
I samlingen er hvert element identifisert med et begrep kalt "subscript." Hvert element i samlingen er tildelt et unikt abonnement. Dataene i den samlingen kan manipuleres eller hentes ved รฅ referere til det unike abonnementet.
Samlinger er mest nyttige ting nรฅr store data av samme type mรฅ behandles eller manipuleres. Samlinger kan fylles ut og manipuleres som helhet ved รฅ bruke 'BULK'-alternativet i Oracle.
Samlinger er klassifisert basert pรฅ struktur, abonnement og lagring som vist nedenfor.
- Indeks for tabeller (ogsรฅ kjent som Associative Array)
- Nestede bord
- Varrays
Nรฅr som helst kan data i samlingen henvises til med tre termer Samlingsnavn, Subscript, Felt/Kolonnenavn som " ( ). ". Du kommer til รฅ lรฆre om disse ovennevnte samlingskategoriene lenger i avsnittet nedenfor.
Varrays
Varray er en innsamlingsmetode der stรธrrelsen pรฅ matrisen er fast. Matrisestรธrrelsen kan ikke overskrides enn dens faste verdi. Subskriptet til Varray har en numerisk verdi. Fรธlgende er attributtene til Varrays.
- รvre grensestรธrrelse er fast
- Fylles sekvensielt og starter med abonnenten "1"
- Denne samlingstypen er alltid tett, dvs. vi kan ikke slette noen array-elementer. Varray kan slettes som en helhet, eller den kan trimmes fra slutten.
- Siden den alltid er tett i naturen, har den svรฆrt mindre fleksibilitet.
- Det er mer hensiktsmessig รฅ bruke nรฅr matrisestรธrrelsen er kjent og รฅ utfรธre lignende aktiviteter pรฅ alle matriseelementene.
- Abonnementet og sekvensen forblir alltid stabile, dvs. abonnenten og antallet av samlingen er alltid det samme.
- De mรฅ initialiseres fรธr de brukes i programmer. Enhver operasjon (unntatt EXISTS-operasjon) pรฅ en uinitialisert samling vil gi en feil.
- Det kan opprettes som et databaseobjekt, som er synlig i hele databasen eller inne i underprogrammet, som kun kan brukes i det underprogrammet.
Figuren nedenfor vil forklare minnetildelingen til Varray (tett) skjematisk.
| Senket | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| Verdi | X Y Z | Dfv | Sde | Cxs | Vbc | Myk | Qwe |
Syntaks for VARRAY:
TYPE <type_name> IS VARRAY (<SIZE>) OF <DATA_TYPE>;
- I syntaksen ovenfor er type_name erklรฆrt som VARRAY av typen 'DATA_TYPE' for den gitte stรธrrelsesgrensen. Datatypen kan enten vรฆre enkel eller kompleks.
Nestede tabeller
En nestet tabell er en samling der stรธrrelsen pรฅ matrisen ikke er fast. Den har den numeriske subskripttypen. Nedenfor er flere beskrivelser om nestet tabelltype.
- Nested-bordet har ingen รธvre stรธrrelsesgrense.
- Siden den รธvre stรธrrelsesgrensen ikke er fast, mรฅ samlingen, minnet utvides hver gang fรธr vi bruker den. Vi kan utvide samlingen ved รฅ bruke sรธkeordet 'EXTEND'.
- Fylles i rekkefรธlge og starter med subskriptet '1'.
- Denne samlingstypen kan vรฆre av begge tett og sparsomt, dvs. vi kan lage samlingen som en tett, og vi kan ogsรฅ slette det enkelte array-elementet tilfeldig, noe som gjรธr det sรฅ sparsomt.
- Det gir mer fleksibilitet nรฅr det gjelder รฅ slette array-elementet.
- Den er lagret i den systemgenererte databasetabellen og kan brukes i utvalgsspรธrringen for รฅ hente verdiene.
- Subscript og sekvens er ikke stabile, dvs. subscript og telling av array-elementet kan variere.
- De mรฅ initialiseres fรธr de brukes i programmer. Enhver operasjon (unntatt EXISTS-operasjon) pรฅ den uinitialiserte samlingen vil gi en feil.
- Det kan opprettes som et databaseobjekt, som er synlig i hele databasen eller inne i underprogrammet, som kun kan brukes i det underprogrammet.
Figuren nedenfor vil forklare minnetildelingen til Nested Table (tett og sparsomt) skjematisk. Det svarte elementrommet angir det tomme elementet i en samling, dvs. sparsomt.
| Senket | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| Verdi (tett) | X Y Z | Dfv | Sde | Cxs | Vbc | Myk | Qwe |
| Verdi (sparsom) | Qwe | asd | Afg | asd | Wer |
Syntaks for nestet tabell:
TYPE <tvpe name> IS TABLE OF <DATA TYPE>;
- I syntaksen ovenfor er typenavn erklรฆrt som Nestet tabellsamling av typen 'DATA_TYPE'. Datatypen kan enten vรฆre enkel eller kompleks.
Indeks for tabell
Indeks-for-tabell er en samling der matrisestรธrrelsen ikke er fast. I motsetning til de andre samlingstypene, i indeks-for-tabell-samlingen kan subskriptet bestรฅ av brukeren. Fรธlgende er attributtene til indeks for tabell.
- Subskriptet kan ha heltall eller strenger. Ved opprettelse av samlingen skal abonnementstypen nevnes.
- Disse samlingene lagres ikke sekvensielt.
- De er alltid sparsomme i naturen.
- Matrisestรธrrelsen er ikke fast.
- De kan ikke lagres i databasekolonnen. De skal opprettes og brukes i et hvilket som helst program i den aktuelle รธkten.
- De gir mer fleksibilitet nรฅr det gjelder รฅ opprettholde abonnement.
- Abonnementene kan ogsรฅ ha negativ sekvens.
- De er mer hensiktsmessige รฅ bruke for relativt mindre kollektive verdier der samlingen kan initialiseres og brukes innenfor de samme underprogrammene.
- De trenger ikke initialiseres fรธr du begynner รฅ bruke dem.
- Det kan ikke opprettes som et databaseobjekt. Det kan bare opprettes i underprogrammet, som kun kan brukes i det underprogrammet.
- BULK COLLECT kan ikke brukes i denne samlingstypen da subscriptet skal gis eksplisitt for hver post i samlingen.
Figuren nedenfor vil forklare minnetildelingen til Nested Table (sparsom) skjematisk. Det svarte elementrommet angir det tomme elementet i en samling, dvs. sparsomt.
| Subscript (varchar) | FรRST | SECOND | TREDJE | FJERDE | FEMTE | SJETTE | SYVENDE |
| Verdi (sparsom) | Qwe | asd | Afg | asd | Wer |
Syntaks for indeks for tabell
TYPE <type_name> IS TABLE OF <DATA_TYPE> INDEX BY VARCHAR2 (10);
- I syntaksen ovenfor er typenavn erklรฆrt som en indeks-for-tabell-samling av typen 'DATA_TYPE'. Datatypen kan enten vรฆre enkel eller kompleks. Abonnent/indeksvariabelen er gitt som VARCHAR2-type med maksimal stรธrrelse som 10.
Konstruktรธr og initialiseringskonsept i samlinger
Konstruktรธrer er den innebygde funksjonen levert av oraklet som har samme navn som objektet eller samlingene. De utfรธres fรธrst nรฅr objekt eller samlinger blir henvist for fรธrste gang i en รธkt. Nedenfor er de viktige detaljene om konstruktรธr i samlingssammenheng:
- For samlinger bรธr disse konstruktรธrene kalles eksplisitt for รฅ initialisere den.
- Bรฅde Varray- og Nested-tabeller mรฅ initialiseres gjennom disse konstruktรธrene fรธr de henvises til programmet.
- Konstruktรธr utvider implisitt minneallokeringen for en samling (unntatt Varray), og derfor kan konstruktรธr ogsรฅ tilordne variablene til samlingene.
- ร tildele verdier til samlingen gjennom konstruktรธrer vil aldri gjรธre samlingen sparsom.
Innsamlingsmetoder
Oracle gir mange funksjoner for รฅ manipulere og รฅ jobbe med samlingene. Disse funksjonene er svรฆrt nyttige i programmet for รฅ bestemme og endre de forskjellige egenskapene til samlingene. Tabellen nedenfor vil gi de forskjellige funksjonene og deres beskrivelse.
| Metode | Tekniske beskrivelser | SYNTAKS |
|---|---|---|
| FINNES (n) | Denne metoden vil returnere boolske resultater. Det vil returnere 'TRUE' hvis nth elementet finnes i den samlingen, ellers vil det returnere FALSE. Bare EXISTS-funksjoner kan brukes i uinitialisert samling | .EXISTS(element_posisjon) |
| COUNT | Gir det totale antallet av elementene som er tilstede i en samling | .TELLE |
| BEGRENSE | Det returnerer den maksimale stรธrrelsen pรฅ samlingen. For Varray vil den returnere den faste stรธrrelsen som er definert. For Nestet tabell og Indeks-for-tabell gir det NULL | .BEGRENSE |
| FรRST | Returnerer verdien til den fรธrste indeksvariabelen (nedsett) av samlingene | .FรRST |
| SISTE | Returnerer verdien av den siste indeksvariabelen (underskrift) av samlingene | .SISTE |
| PRIOR (n) | Returnerer gรฅr foran indeksvariabel i en samling av nth element. Hvis det ikke er noen foranstรฅende, returneres indeksverdien NULL | .PRIOR(n) |
| NESTE (n) | Returnerer etterfรธlger indeksvariabel i en samling av nth element. Hvis det ikke er noen suksess, returneres indeksverdien NULL | .NESTE(n) |
| FORLENGE | Utvider ett element i en samling pรฅ slutten | .FORLENGE |
| FORLENG (n) | Utvider n elementer pรฅ slutten av en samling | .EXTEND(n) |
| FORLENG (n,i) | Utvider n kopier av ith element pรฅ slutten av samlingen | .EXTEND(n,i) |
| TRIM | Fjerner ett element fra slutten av samlingen | .TRIM |
| TRIM (n) | Fjerner n elementer fra slutten av samlingen | .TRIM (n) |
| SLETT | Sletter alle elementene fra samlingen. Gjรธr samlingen tom | .SLETT |
| SLETT (n) | Sletter det n-te elementet fra samlingen. Hvis nth elementet er NULL, vil dette ikke gjรธre noe | .DELETE(n) |
| SLETT (m,n) | Sletter elementet i omrรฅdet mth denne nth i samlingen | .DELETE(m,n) |
Eksempel 1: Opptakstype pรฅ underprogramnivรฅ
I dette eksemplet skal vi se hvordan du fyller ut samlingen ved รฅ bruke 'MASSESAMLING' og hvordan henvise innsamlingsdataene.
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;
/
Kodeforklaring:
- Kodelinje 2-8: Record type 'emp_det' er deklarert med kolonnene emp_no, emp_name, lรธnn og manager av datatype NUMBER, VARCHAR2, NUMBER, NUMBER.
- Kodelinje 9: Opprette samlingen 'emp_det_tbl' av posttypeelementet 'emp_det'
- Kodelinje 10: Erklรฆrer variabelen 'guru99_emp_rec' som 'emp_det_tbl'-type og initialisert med null-konstruktรธr.
- Kodelinje 12-15: Setter inn eksempeldataene i 'emp'-tabellen.
- Kodelinje 16: Begรฅr innsettingstransaksjonen.
- Kodelinje 17: Henter postene fra 'emp'-tabellen og fyller inn samlingsvariabelen som en bulk ved รฅ bruke kommandoen "BULK COLLECT". Nรฅ inneholder variabelen 'guru99_emp_rec' all posten som finnes i tabellen 'emp'.
- Kodelinje 19-26: Innstilling av 'FOR'-lรธkken med รฅ skrive ut alle postene i samlingen รฉn etter รฉn. Innsamlingsmetoden FรRST og SISTE brukes som nedre og hรธyere grense for slรธyfe.
Produksjon: Som du kan se i skjermbildet ovenfor nรฅr koden ovenfor utfรธres, vil du fรฅ fรธlgende utgang
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 ----------------------------------------------

