Oracle PL/SQL-samlinger: Varrays, Nested & Index by Tables

Hvad er samling?

En samling er en ordnet gruppe af elementer af bestemte datatyper. Det kan være en samling af simple datatyper eller komplekse datatyper (som brugerdefinerede eller registreringstyper).

I samlingen er hvert element identificeret med et udtryk kaldet "subscript." Hvert element i samlingen er tildelt et unikt abonnement. Dataene i denne samling kan manipuleres eller hentes ved at henvise til det unikke subscript.

Samlinger er mest nyttige ting, når store data af samme type skal behandles eller manipuleres. Samlinger kan udfyldes og manipuleres som helhed ved at bruge 'BULK'-indstillingen i Oracle.

Samlinger klassificeres baseret på strukturen, abonnementet og lagringen som vist nedenfor.

  • Indeks-for-tabeller (også kendt som Associative Array)
  • Indlejrede borde
  • Varrays

På ethvert tidspunkt kan data i samlingen henvises til med tre termer Samlingsnavn, Subscript, Felt/Kolonnenavn som " ( ). ”. Du kommer til at lære om disse ovennævnte samlingskategorier længere i nedenstående afsnit.

Varrays

Varray er en indsamlingsmetode, hvor størrelsen af ​​arrayet er fastsat. Matrixstørrelsen kan ikke overskrides end dens faste værdi. Varray'ens underskrift har en numerisk værdi. Følgende er egenskaberne for Varrays.

  • Den øvre grænsestørrelse er fast
  • Udfyldes sekventielt startende med sænket "1"
  • Denne samlingstype er altid tæt, dvs. vi kan ikke slette nogen array-elementer. Varray kan slettes som en helhed, eller den kan trimmes fra slutningen.
  • Da det altid er tæt i naturen, har det meget mindre fleksibilitet.
  • Det er mere passende at bruge, når array-størrelsen er kendt, og at udføre lignende aktiviteter på alle array-elementerne.
  • Sænkningen og sekvensen forbliver altid stabile, dvs. sænkningen og antallet af samlingen er altid det samme.
  • De skal initialiseres, før de bruges i programmer. Enhver handling (undtagen EXISTS operation) på en ikke-initialiseret samling vil give en fejl.
  • Det kan oprettes som et databaseobjekt, som er synligt i hele databasen eller inde i underprogrammet, som kun kan bruges i det underprogram.

Nedenstående figur vil forklare hukommelsesallokeringen af ​​Varray (tæt) diagrammatisk.

Sænket 1 2 3 4 5 6 7
Værdi xyz Dfv Sde Cxs Vbc Blød Qwe

Syntaks for VARRAY:

TYPE <type_name> IS VARRAY (<SIZE>) OF <DATA_TYPE>;
  • I ovenstående syntaks er typenavn erklæret som VARRAY af typen 'DATA_TYPE' for den givne størrelsesgrænse. Datatypen kan enten være enkel eller kompleks.

Indlejrede tabeller

En indlejret tabel er en samling, hvor størrelsen af ​​arrayet ikke er fastsat. Den har den numeriske subscripttype. Nedenfor er flere beskrivelser om indlejret tabeltype.

  • Det indlejrede bord har ingen øvre størrelsesgrænse.
  • Da den øvre størrelsesgrænse ikke er fast, skal samlingen, hukommelsen udvides hver gang, før vi bruger den. Vi kan udvide samlingen ved at bruge 'EXTEND' nøgleordet.
  • Udfyldes sekventielt startende med sænket "1".
  • Denne samlingstype kan være af begge tæt og sparsomt, dvs. vi kan oprette samlingen som en tæt, og vi kan også slette det enkelte array-element tilfældigt, hvilket gør det så sparsomt.
  • Det giver mere fleksibilitet med hensyn til sletning af array-elementet.
  • Den er gemt i den systemgenererede databasetabel og kan bruges i valgforespørgslen til at hente værdierne.
  • Sænkningen og sekvensen er ikke stabile, dvs. sænkningen og antallet af array-elementet kan variere.
  • De skal initialiseres, før de bruges i programmer. Enhver operation (undtagen EXISTS operation) på den ikke-initialiserede samling vil give en fejl.
  • Det kan oprettes som et databaseobjekt, som er synligt i hele databasen eller inde i underprogrammet, som kun kan bruges i det underprogram.

Nedenstående figur vil forklare hukommelsesallokeringen af ​​Nested Table (tæt og sparsom) diagrammatisk. Det sortfarvede elementrum angiver det tomme element i en samling, dvs. sparsomt.

Sænket 1 2 3 4 5 6 7
Værdi (tæt) xyz Dfv Sde Cxs Vbc Blød Qwe
Værdi (sparsom) Qwe asd Afg asd Wer

Syntaks for indlejret tabel:

TYPE <tvpe name> IS TABLE OF <DATA TYPE>;
  • I ovenstående syntaks er typenavn erklæret som indlejret tabelsamling af typen 'DATA_TYPE'. Datatypen kan enten være enkel eller kompleks.

Indeks-for-tabel

Indeks-for-tabel er en samling, hvor array-størrelsen ikke er fast. I modsætning til de andre samlingstyper kan subscriptet i indeks-for-tabel-samlingen bestå defineres af brugeren. Følgende er egenskaberne for indeks-for-tabel.

  • Den sænkede kan af heltal eller strenge. På tidspunktet for oprettelse af samlingen skal abonnenttypen nævnes.
  • Disse samlinger gemmes ikke sekventielt.
  • De er altid sparsomme i naturen.
  • Matrixstørrelsen er ikke fast.
  • De kan ikke gemmes i databasekolonnen. De skal oprettes og bruges i ethvert program i den pågældende session.
  • De giver mere fleksibilitet i forhold til at opretholde abonnement.
  • Sænkningen kan også være af negativ sænket sekvens.
  • De er mere passende at bruge til relativt mindre kollektive værdier, hvor samlingen kan initialiseres og bruges inden for de samme underprogrammer.
  • De behøver ikke initialiseres, før du begynder at bruge dem.
  • Det kan ikke oprettes som et databaseobjekt. Det kan kun oprettes inde i underprogrammet, som kun kan bruges i det underprogram.
  • BULK COLLECT kan ikke bruges i denne samlingstype, da subscriptet skal angives eksplicit for hver post i samlingen.

Nedenstående figur vil forklare hukommelsesallokeringen af ​​Nested Table (spare) diagrammatisk. Det sortfarvede elementrum angiver det tomme element i en samling, dvs. sparsomt.

Subscript (varchar) FØRST ANDEN TREDJE FJERDE Femte SJETTE SYVENDE
Værdi (sparsom) Qwe asd Afg asd Wer

Syntaks for indeks-for-tabel

TYPE <type_name> IS TABLE OF <DATA_TYPE> INDEX BY VARCHAR2 (10);
  • I ovenstående syntaks er typenavn erklæret som en indeks-for-tabel samling af typen 'DATA_TYPE'. Datatypen kan enten være enkel eller kompleks. Subsciprt/indeksvariablen er angivet som VARCHAR2-type med maksimal størrelse som 10.

Konstruktør og initialiseringskoncept i samlinger

Konstruktører er den indbyggede funktion leveret af oraklet, der har samme navn som objektet eller samlingerne. De udføres først, når objekt eller samlinger henvises for første gang i en session. Nedenfor er de vigtige detaljer om konstruktør i samlingssammenhæng:

  • For samlinger bør disse konstruktører kaldes eksplicit for at initialisere den.
  • Både Varray- og Nested-tabeller skal initialiseres gennem disse konstruktører, før de henvises til programmet.
  • Constructor udvider implicit hukommelsesallokeringen for en samling (undtagen Varray), og derfor kan konstruktøren også tildele variablerne til samlingerne.
  • At tildele værdier til samlingen gennem konstruktører vil aldrig gøre samlingen sparsom.

Indsamlingsmetoder

Oracle giver mange funktioner til at manipulere og arbejde med samlingerne. Disse funktioner er meget nyttige i programmet til at bestemme og ændre samlingernes forskellige egenskaber. Den følgende tabel vil give de forskellige funktioner og deres beskrivelse.

Metode Description SYNTAKS
FINDER (n) Denne metode vil returnere booleske resultater. Det vil returnere 'TRUE' hvis nth element findes i den samling, ellers vil det returnere FALSE. Kun EXISTS-funktioner kan bruges i uinitialiseret samling .EXISTS(element_position)
COUNT Giver det samlede antal af elementerne i en samling .TÆLLE
GRÆNSE Det returnerer samlingens maksimale størrelse. For Varray vil den returnere den faste størrelse, der er blevet defineret. For indlejrede tabel og indeks-for-tabel giver det NULL .BEGRÆNSE
FØRST Returnerer værdien af ​​den første indeksvariabel (sænket) af samlingerne .FØRST
LAST Returnerer værdien af ​​den sidste indeksvariabel (sænket) af samlingerne .SIDST
FORUD (n) Returnerer går forud for indeksvariabel i en samling af nth element. Hvis der ikke er nogen forudgående indeksværdi returneres NULL .PRIOR(n)
NÆSTE (n) Returnerer efterfølger indeksvariabel i en samling af nth element. Hvis der ikke er nogen succes, returneres indeksværdien NULL .NÆSTE(n)
FORLÆNGE Udvider ét element i en samling i slutningen .FORLÆNGE
FORLÆNG (n) Udvider n elementer i slutningen af ​​en samling .EXTEND(n)
FORLÆNG (n,i) Udvider n kopier af ith element i slutningen af ​​samlingen .EXTEND(n,i)
TRIMME Fjerner ét element fra slutningen af ​​samlingen .TRIMME
TRIM (n) Fjerner n elementer fra slutningen af ​​samlingen .TRIM (n)
SLET Sletter alle elementer fra samlingen. Gør samlingen tom .SLET
SLET (n) Sletter det n'te element fra samlingen. Hvis såth element er NULL, så vil dette ikke gøre noget .DELETE(n)
SLET (m,n) Sletter elementet i området mth denne nth i samlingen .DELETE(m,n)

Eksempel 1: Optagetype på underprogramniveau

I dette eksempel skal vi se, hvordan man udfylder samlingen ved hjælp af 'MASSEINDSAMLING' og hvordan man henviser til indsamlingsdataene.

Record Type på underprogramniveau

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 deklareret med kolonnerne emp_no, emp_name, løn og manager af datatype NUMBER, VARCHAR2, NUMBER, NUMBER.
  • Kodelinje 9: Oprettelse af samlingen 'emp_det_tbl' af posttypeelementet 'emp_det'
  • Kodelinje 10: Erklærer variablen 'guru99_emp_rec' som 'emp_det_tbl'-type og initialiseret med null-konstruktør.
  • Kodelinje 12-15: Indsættelse af eksempeldata i 'emp'-tabellen.
  • Kodelinje 16: Forpligtelse af indsættelsestransaktionen.
  • Kodelinje 17: Henter posterne fra 'emp'-tabellen og udfylder samlingsvariablen som en bulk ved hjælp af kommandoen "BULK COLLECT". Nu indeholder variablen 'guru99_emp_rec' alle de poster, der er til stede i tabellen 'emp'.
  • Kodelinje 19-26: Indstilling af 'FOR'-løkken med at udskrive alle poster i samlingen én for én. Indsamlingsmetoden FØRST og SIDST bruges som nedre og højere grænse for loop.

Produktion: Som du kan se på ovenstående skærmbillede, når ovenstående kode udføres, får du følgende output

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