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

Innholdsfortegnelse:

Anonim

Hva er samling?

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

I samlingen identifiseres hvert element med et begrep kalt "abonnement". Hvert element i samlingen er tildelt et unikt abonnement. Dataene i samlingen kan manipuleres eller hentes ved å referere til det unike abonnementet.

Samlinger er mest nyttige når store data av samme type må behandles eller manipuleres. Samlinger kan fylles ut og manipuleres som helhet ved å bruke 'BULK' i Oracle.

I denne veiledningen vil du lære-

  • Hva er samling?
  • Varianter
  • Nestede tabeller
  • Indeks for tabell
  • Konstruktør og initialiseringskonsept i samlinger
  • Samlingsmetoder

Samlinger klassifiseres basert på struktur, abonnement og lagring som vist nedenfor.

  • Indeks for tabeller (også kjent som Associative Array)
  • Nestede bord
  • Varianter

Når som helst kan data i samlingen henvises til tre termer Samlingsnavn, Abonnement, Felt / Kolonnenavn som " (). Du kommer til å lære om disse ovennevnte samlingskategoriene videre i avsnittet nedenfor.

Varianter

Varray er en samlingsmetode der størrelsen på matrisen er fast. Arraystørrelsen kan ikke overskrides enn den faste verdien. Abonnementet på Varray har en numerisk verdi. Følgende er attributtene til Varrays.

  • Øvre grense størrelse er fast
  • Befolket sekvensielt startende med abonnementet '1'
  • Denne samlingstypen er alltid tett, dvs. vi kan ikke slette noen matriseelementer. Varray kan slettes som en helhet, eller den kan trimmes fra slutten.
  • Siden det alltid er tett i naturen, har det veldig 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. at abonnementet og antallet av samlingen alltid er det samme.
  • De må initialiseres før de brukes i programmer. Enhver operasjon (unntatt EXISTS-operasjon) på en ikke-initialisert samling vil føre til en feil.
  • Det kan opprettes som et databaseobjekt, som er synlig i hele databasen eller inne i underprogrammet, som bare kan brukes i det underprogrammet.

Figuren nedenfor vil forklare minnetildelingen av Varray (tett) skjematisk.

Abonnement 1 2 3 4 5 6 7
Verdi Xyz Dfv Sde Cxs Vbc Nhu Qwe

Syntaks for VARRAY:

TYPE  IS VARRAY () OF ;
  • I syntaksen ovenfor er type navn erklært som VARRAY av typen 'DATA_TYPE' for den gitte størrelsesgrensen. Datatypen kan være enten enkel eller kompleks.

Nestede tabeller

En nestet tabell er en samling der størrelsen på matrisen ikke er fast. Den har den numeriske abonnementstypen. Nedenfor er flere beskrivelser om nestet tabelltype.

  • Den nestede tabellen har ingen øvre størrelsesgrense.
  • Siden den øvre størrelsesgrensen ikke er fast, må samlingen utvides minne hver gang før vi bruker den. Vi kan utvide samlingen ved hjelp av 'EXTEND' nøkkelord.
  • Befolket sekvensielt startende med abonnementet '1'.
  • Denne samlingstypen kan være både tett og sparsom , dvs. vi kan opprette samlingen som en tett, og vi kan også slette det enkelte matriseelementet 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.
  • Subskriptet og sekvensen er ikke stabile, dvs. abonnementet og antallet av array-elementet kan variere.
  • De må initialiseres før de brukes i programmer. Enhver operasjon (unntatt EXISTS-operasjon) på den ikke-initialiserte samlingen vil føre til en feil.
  • Det kan opprettes som et databaseobjekt, som er synlig i hele databasen eller inne i underprogrammet, som bare kan brukes i det underprogrammet.

Figuren nedenfor vil forklare hukommelsesallokeringen av nestet tabell (tett og sparsom) skjematisk. Det svarte fargede elementområdet betegner det tomme elementet i en samling, dvs. sparsomt.

Abonnement 1 2 3 4 5 6 7
Verdi (tett) Xyz Dfv Sde Cxs Vbc Nhu Qwe
Verdi (sparsom) Qwe Asd Afg Asd Wer

Syntaks for nestet tabell:

TYPE  IS TABLE OF ;
  • I ovennevnte syntaks er type navn erklært som nestet tabellsamling av typen 'DATA_TYPE'. Datatypen kan være enten enkel eller kompleks.

Indeks for tabell

Indeks for tabell er en samling der matrisestørrelsen ikke er løst. I motsetning til de andre samlingstypene kan abonnementet i indeks-for-tabell-samlingen bestå av brukeren. Følgende er attributtene til indeks for tabell.

  • Subskriptet kan av heltall eller strenger. Når du oppretter samlingen, bør abonnementstypen nevnes.
  • Disse samlingene lagres ikke sekvensielt.
  • De er alltid sparsomme i naturen.
  • Arraystørrelsen er ikke løst.
  • De kan ikke lagres i databasekolonnen. De skal opprettes og brukes i ethvert program i den aktuelle økten.
  • De gir mer fleksibilitet når det gjelder å opprettholde abonnementet.
  • Abonnementene kan også ha negativ tegnsekvens.
  • De er mer hensiktsmessige å bruke for relativt mindre kollektive verdier der samlingen kan initialiseres og brukes i 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 bare kan brukes i det underprogrammet.
  • BULK COLLECT kan ikke brukes i denne samlingstypen, da abonnementet skal gis eksplisitt for hver post i samlingen.

Figuren nedenfor vil forklare hukommelsesallokeringen av Nested Table (sparsom) diagrammatisk. Det svarte fargede elementområdet betegner det tomme elementet i en samling, dvs. sparsomt.

Abonnement (varchar) FØRST SEKUND TREDJE FJERDE FEMTE SJETTE SYVENDE
Verdi (sparsom) Qwe Asd Afg Asd Wer

Syntaks for indeks for tabell

TYPE  IS TABLE OF  INDEX BY VARCHAR2 (10);
  • I ovennevnte syntaks er type navn erklært som en indeks-for-tabell samling av typen 'DATA_TYPE'. Datatypen kan være enten enkel eller kompleks. Subscrt / indeksvariabelen er gitt som VARCHAR2-type med maksimal størrelse som 10.

Konstruktør og initialiseringskonsept i samlinger

Konstruktører er den innebygde funksjonen som tilbys 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 viktige detaljer om konstruktør i samlingssammenheng:

  • For samlinger, bør disse konstruktørene kalles eksplisitt for å initialisere den.
  • Både Varray- og Nested-tabellene må initialiseres gjennom disse konstruktørene før de blir henvist til programmet.
  • Constructor utvider implisitt minnetildelingen for en samling (unntatt Varray), og derfor kan konstruktøren også tilordne variablene til samlingene.
  • Å tildele verdier til samlingen gjennom konstruktører vil aldri gjøre samlingen sparsom.

Samlingsmetoder

Oracle har mange funksjoner for å manipulere og arbeide med samlingene. Disse funksjonene er veldig nyttige i programmet for å bestemme og endre de forskjellige attributtene til samlingene. Følgende tabell vil gi de forskjellige funksjonene og beskrivelsen av dem.

Metode Beskrivelse SYNTAX
EKSISTER (n) Denne metoden vil gi boolske resultater. Det vil returnere 'SANT' hvis det nte elementet finnes i den samlingen, ellers vil det returnere FALSE. Bare EXISTS-funksjoner kan brukes i ikke-initialisert samling .EXISTS (elementposisjon)
TELLE Oppgir det totale antallet elementene som er tilstede i en samling .COUNT
GRENSE Den 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 .LIMIT
FØRST Returnerer verdien av den første indeksvariabelen (abonnement) i samlingene FØRSTE
SISTE Returnerer verdien av den siste indeksvariabelen (abonnement) i samlingene .LAST
TIDLIGERE (n) Returnerer foran indeksvariabelen i en samling av det niende elementet. Hvis det ikke er noe foran indeksverdien, returneres NULL .PRIOR (n)
NESTE (n) Returnerer vellykket indeksvariabel i en samling av det niende elementet. Hvis det ikke lykkes, returneres indeksverdien NULL .NEXT (n)
FORLENGE Utvider ett element i en samling på slutten .EXTEND
FORLENG (n) Utvider n elementer på slutten av en samling .EXTEND (n)
FORLENG (n, i) Utvider n kopier av det i te element i enden av samlingen .EXTEND (n, i)
LISTVERK 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 niende elementet fra samlingen. Hvis det niende elementet er NULL, vil dette ikke gjøre noe . DELETE (n)
SLETT (m, n) Sletter element i spekter m th n th i samlingen . DELETE (m, n)

Eksempel1: Opptakstype på underprogramnivå

I dette eksemplet skal vi se hvordan du kan fylle ut samlingen ved hjelp av 'BULK COLLECT' og hvordan vi skal henvise samlingsdataene.

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 : Posttype 'emp_det' er erklært med kolonner emp_no, emp_name, lønn og manager for datatypen 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 initialiseres med null konstruktør.
  • Kodelinje 12-15: Sette inn eksempeldataene i 'emp' -tabellen.
  • Kodelinje 16: Foreta innsettingstransaksjonen.
  • Kodelinje 17: Henter postene fra 'emp' -tabellen og fyller ut samlevariabelen som en bulk ved hjelp av kommandoen "BULK COLLECT". Nå inneholder variabelen 'guru99_emp_rec' alle postene som er tilstede i tabellen 'emp'.
  • Kodelinje 19-26: Angi FOR-sløyfen ved å skrive ut alle postene i samlingen en etter en. Oppsamlingsmetoden FIRST og LAST brukes som nedre og høyere grense for sløyfen.

Utgang : Som du kan se på skjermbildet ovenfor når koden ovenfor blir utført, får du følgende utdata

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