Oracle PL / SQL-samlinger: Varrays, Nested & Indeks efter tabeller

Indholdsfortegnelse:

Anonim

Hvad er samling?

En samling er en ordnet gruppe af elementer af bestemte datatyper. Det kan være en samling af enkel datatype eller kompleks datatype (som brugerdefinerede eller posttyper).

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

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

I denne vejledning lærer du-

  • Hvad er samling?
  • Varianter
  • Indlejrede tabeller
  • Indeks-for-tabel
  • Konstruktør og initialiseringskoncept i samlinger
  • Indsamlingsmetoder

Samlinger klassificeres baseret på struktur, abonnement og opbevaring som vist nedenfor.

  • Indeks-ved-tabeller (også kendt som Associative Array)
  • Indlejrede tabeller
  • Varianter

På ethvert tidspunkt kan data i samlingen henvises med tre udtryk Samlingsnavn, abonnement, felt / kolonnenavn som " (). ". Du vil lære om disse ovennævnte samlingskategorier yderligere i nedenstående afsnit.

Varianter

Varray er en samlingsmetode, hvor størrelsen på arrayet er fast. Arraystørrelsen kan ikke overskrides end dens faste værdi. Abonnementet på Varray har en numerisk værdi. Følgende er Varrays attributter.

  • Øvre grænsestørrelse er fast
  • Befolket sekventielt startende med abonnementet '1'
  • Denne samlingstype er altid tæt, dvs. vi kan ikke slette nogen matrixelementer. Varray kan slettes som en helhed, eller det 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 arraystørrelsen er kendt, og at udføre lignende aktiviteter på alle arrayelementerne.
  • Abonnementet og sekvensen forbliver altid stabile, dvs. abonnementet og antallet af samlingen er altid det samme.
  • De skal initialiseres, inden de bruges i programmer. Enhver handling (undtagen EXISTS-handling) på en ikke-initialiseret samling vil kaste en fejl.
  • Det kan oprettes som et databaseobjekt, der er synligt i hele databasen eller inde i underprogrammet, som kun kan bruges i det underprogram.

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

Abonnement 1 2 3 4 5 6 7
Værdi Xyz Dfv Sde Cxs Vbc Nhu Qwe

Syntaks til VARRAY:

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

Indlejrede tabeller

En indlejret tabel er en samling, hvor arrayets størrelse ikke er fast. Det har den numeriske abonnementstype. Nedenfor er flere beskrivelser af indlejret bordtype.

  • Den indlejrede tabel 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 hjælp af 'EXTEND' nøgleord.
  • Befolket sekventielt startende med abonnementet '1'.
  • Denne samlingstype kan være både tæt og sparsom , dvs. vi kan oprette samlingen som en tæt, og vi kan også slette det enkelte array-element tilfældigt, hvilket gør det som sparsomt.
  • Det giver mere fleksibilitet med hensyn til sletning af matrixelementet.
  • Den er gemt i den systemgenererede databasetabel og kan bruges i selve forespørgslen til at hente værdierne.
  • Subskriptet og sekvensen er ikke stabile, dvs. abonnementet og antallet af array-elementet kan variere.
  • De skal initialiseres, inden de bruges i programmer. Enhver handling (undtagen EXISTS-handling) på den ikke-initialiserede samling vil medføre en fejl.
  • Det kan oprettes som et databaseobjekt, der er synligt i hele databasen eller inde i underprogrammet, som kun kan bruges i det underprogram.

Nedenstående figur forklarer hukommelsesallokeringen af ​​den indlejrede tabel (tæt og sparsom) diagrammatisk. Det sortfarvede elementrum angiver det tomme element i en samling, dvs. sparsomt.

Abonnement 1 2 3 4 5 6 7
Værdi (tæt) Xyz Dfv Sde Cxs Vbc Nhu Qwe
Værdi (sparsom) Qwe Asd Afg Asd Wer

Syntaks for indlejret tabel:

TYPE  IS TABLE OF ;
  • I ovenstående syntaks erklæres typenavn som indlejret tabelindsamling af typen 'DATA_TYPE'. Datatypen kan være enten simpel eller kompleks.

Indeks-for-tabel

Indeks efter tabel er en samling, hvor matrixstørrelsen ikke er fast. I modsætning til de andre samlingstyper kan abonnementet i indeks-for-tabel-samlingen bestå af brugeren. Følgende er attributterne for indeks for tabel.

  • Abonnementet kan have heltal eller strenge. På tidspunktet for oprettelsen af ​​samlingen skal abonnementstypen nævnes.
  • Disse samlinger gemmes ikke sekventielt.
  • De er altid sparsomme i naturen.
  • Arraystørrelsen er ikke fast.
  • De kan ikke gemmes i databasekolonnen. De oprettes og bruges i ethvert program i den pågældende session.
  • De giver mere fleksibilitet med hensyn til vedligeholdelse af abonnement.
  • Abonnementerne kan også have negativ tegnsekvens.
  • 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 de 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 abonnementet skal gives eksplicit for hver post i samlingen.

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

Abonnement (varchar) FØRST SEKUND TREDJE FJERDE Femte SJETTE SYVENDE
Værdi (sparsom) Qwe Asd Afg Asd Wer

Syntaks til indeks-for-tabel

TYPE  IS TABLE OF  INDEX BY VARCHAR2 (10);
  • I ovenstående syntaks erklæres typenavn som en indeks-for-tabel samling af typen 'DATA_TYPE'. Datatypen kan være enten simpel eller kompleks. Subscrt / 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 samlingskontekst:

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

Indsamlingsmetoder

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

Metode Beskrivelse SYNTAX
EKSISTER (n) Denne metode returnerer boolske resultater. Det returnerer 'TRUE', hvis det nte element findes i denne samling, ellers returnerer det FALSE. Kun EXISTS-funktioner kan bruges i ikke-initialiseret samling . EKSISTER (elementposition)
TÆLLE Giver den samlede optælling af de elementer, der er til stede i en samling .COUNT
BEGRÆNSE Den returnerer den maksimale størrelse på samlingen. For Varray returnerer den den definerede faste størrelse. For indlejret tabel og indeks efter tabel giver det NULL .LIMIT
FØRST Returnerer værdien af ​​samlingens første indeksvariabel (abonnement) FØRSTE
SIDST Returnerer værdien af ​​samlingens sidste indeksvariabel (abonnement) .LAST
FORRIGE (n) Returnerer forud for indeksvariabler i en samling af det n - element. Hvis der ikke er nogen forud for indeksværdien, returneres NULL . PRIOR (n)
NÆSTE (n) Returnerer efterfølgende indeksvariabel i en samling af det n - element. Hvis der ikke er nogen efterfølgende indeksværdi, returneres NULL .NEXT (n)
FORLÆNGE Udvider et element i en samling i slutningen .EXTEND
UDVIDE (n) Udvider n elementer i slutningen af ​​en samling .EXTEND (n)
UDVIDER (n, i) Strækker n kopier af i th ved enden af samlingen .EXTEND (n, i)
TRIMME Fjerner et element fra slutningen af ​​samlingen .TRIM
TRIM (n) Fjerner n elementer fra slutningen af ​​samlingen .TRIM (n)
SLET Sletter alle elementerne fra samlingen. Gør samlingen tom . SLET
SLET (n) Sletter det niende element fra samlingen. Hvis det niende element er NULL, vil dette ikke gøre noget . DELETE (n)
SLET (m, n) Sletter elementet i området m th til n th i samlingen . DELETE (m, n)

Eksempel 1: Optagetype på underprogramniveau

I dette eksempel skal vi se, hvordan samlingen skal udfyldes ved hjælp af 'BULK COLLECT', og hvordan man henviser indsamlingsdataene.

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

Kode Forklaring:

  • Kodelinje 2-8 : Registreringstype 'emp_det' erklæres med kolonner emp_no, emp_name, løn og manager af datatypen NUMBER, VARCHAR2, NUMBER, NUMBER.
  • Kodelinje 9: Oprettelse af samlingen 'emp_det_tbl' af posttypeelementet 'emp_det'
  • Kodelinje 10: Erklæring om variablen 'guru99_emp_rec' som 'emp_det_tbl' type og initialiseret med null konstruktør.
  • Kodelinje 12-15: Indsættelse af eksempeldataene i 'emp' -tabellen.
  • Kodelinje 16: Foretag indsættelsestransaktionen.
  • Kodelinje 17: Henter poster 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' -sløjfen ved at udskrive alle poster i samlingen en efter en. Samlingsmetoden FIRST og LAST bruges som nedre og højere grænse for sløjfen.

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

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