Oracle PL / SQL-samlingar: Varrays, Nested & Indexera av tabeller

Innehållsförteckning:

Anonim

Vad är samling?

En samling är en ordnad grupp av element av vissa datatyper. Det kan vara en samling av enkel datatyp eller komplex datatyp (som användardefinierade eller posttyper).

I samlingen identifieras varje element med en term som kallas "abonnemang". Varje objekt i samlingen tilldelas ett unikt prenumeration. Uppgifterna i den samlingen kan manipuleras eller hämtas genom att hänvisa till det unika prenumerationen.

Samlingar är mest användbara saker när stora data av samma typ behöver bearbetas eller manipuleras. Samlingar kan fyllas i och manipuleras som helhet med alternativet 'BULK' i Oracle.

I den här handledningen lär du dig-

  • Vad är samling?
  • Varrays
  • Kapslade tabeller
  • Index-för-tabell
  • Konstruktör och initialiseringskoncept i samlingar
  • Insamlingsmetoder

Samlingar klassificeras baserat på struktur, prenumeration och lagring enligt nedan.

  • Index-by-tables (även känd som Associative Array)
  • Kapslade bord
  • Varrays

När som helst kan data i samlingen hänvisas med tre termer Samlingsnamn, Subscript, Field / Column name som " (). ". Du kommer att lära dig mer om dessa ovan nämnda samlingskategorier ytterligare i avsnittet nedan.

Varrays

Varray är en samlingsmetod där storleken på arrayen är fixerad. Arraystorleken kan inte överskridas än dess fasta värde. Varrays prenumeration har ett numeriskt värde. Följande är attributen för Varrays.

  • Övre gränsstorlek är fast
  • Befolkat sekventiellt med början "1"
  • Denna samlingstyp är alltid tät, dvs vi kan inte ta bort några arrayelement. Varray kan raderas som en helhet, eller så kan den trimmas från slutet.
  • Eftersom det alltid är tätt i naturen har det mycket mindre flexibilitet.
  • Det är lämpligare att använda när arraystorleken är känd och att utföra liknande aktiviteter på alla arrayelementen.
  • Prenumerationen och sekvensen förblir alltid stabila, dvs. prenumerationen och antalet i samlingen är alltid densamma.
  • De måste initieras innan de används i program. Alla operationer (förutom EXISTS-operation) på en oinitialiserad samling kommer att orsaka ett fel.
  • Det kan skapas som ett databasobjekt som syns i hela databasen eller inuti underprogrammet, som endast kan användas i det underprogrammet.

Figuren nedan förklarar diagrammatiskt minnesfördelningen av Varray (tät).

Index 1 2 3 4 5 6 7
Värde Xyz Dfv Sde Cxs Vbc Nhu Qwe

Syntax för VARRAY:

TYPE  IS VARRAY () OF ;
  • I ovanstående syntax deklareras typnamn som VARRAY av typen 'DATA_TYPE' för den angivna storleksgränsen. Datatypen kan vara antingen enkel eller komplex.

Kapslade tabeller

En kapslad tabell är en samling där arrayens storlek inte är fixerad. Den har den numeriska prenumerationstypen. Nedan finns fler beskrivningar om kapslad tabelltyp.

  • Den kapslade tabellen har ingen övre storleksgräns.
  • Eftersom den övre storleksgränsen inte är fast måste samlingen, minnet utökas varje gång innan vi använder den. Vi kan utöka samlingen med nyckelordet 'EXTEND'.
  • Befolkat sekventiellt med början '1'.
  • Denna samlingstyp kan vara både tät och gles , dvs. vi kan skapa samlingen som en tät, och vi kan också ta bort det enskilda arrayelementet slumpmässigt, vilket gör det som gles.
  • Det ger mer flexibilitet när det gäller att radera arrayelementet.
  • Den lagras i den systemgenererade databastabellen och kan användas i väljfrågan för att hämta värdena.
  • Subskriptet och sekvensen är inte stabila, dvs abonnemanget och antalet element i arrayen kan variera.
  • De måste initieras innan de används i program. Alla operationer (förutom EXISTS-operation) på den oinitialiserade samlingen kommer att orsaka ett fel.
  • Det kan skapas som ett databasobjekt som syns i hela databasen eller inuti underprogrammet, som endast kan användas i det underprogrammet.

Nedanstående figur kommer att förklara diagrammatiskt minnesfördelningen av nestad tabell (tät och gles). Det svartfärgade elementutrymmet anger det tomma elementet i en samling, dvs. gles.

Index 1 2 3 4 5 6 7
Värde (tät) Xyz Dfv Sde Cxs Vbc Nhu Qwe
Värde (gles) Qwe Asd Afg Asd Vi är

Syntax för kapslad tabell:

TYPE  IS TABLE OF ;
  • I ovanstående syntax deklareras typnamn som kapslad tabellsamling av typen 'DATA_TYPE'. Datatypen kan vara antingen enkel eller komplex.

Index-för-tabell

Index för tabell är en samling där matrisstorleken inte är fixerad. Till skillnad från de andra samlingstyperna, i index-för-tabell-samlingen kan prenumerationen definieras av användaren. Följande är attributen för index för tabell.

  • Prenumerationen kan av heltal eller strängar. När samlingen skapas bör prenumerationstypen nämnas.
  • Dessa samlingar lagras inte sekventiellt.
  • De är alltid glesa i naturen.
  • Matrisstorleken är inte fast.
  • De kan inte lagras i databaskolumnen. De ska skapas och användas i alla program under just den sessionen.
  • De ger mer flexibilitet när det gäller att upprätthålla prenumerationen.
  • Prenumerationerna kan också ha en negativ prenumerationssekvens.
  • De är mer lämpliga att använda för relativt mindre kollektiva värden där samlingen kan initieras och användas inom samma delprogram.
  • De behöver inte initieras innan du börjar använda dem.
  • Det kan inte skapas som ett databasobjekt. Det kan bara skapas inuti underprogrammet, som endast kan användas i det underprogrammet.
  • BULK COLLECT kan inte användas i den här samlingstypen eftersom prenumerationen ska ges uttryckligen för varje post i samlingen.

Nedanstående figur förklarar diagrammatiskt minnesallokeringen av nestad tabell (gles). Det svartfärgade elementutrymmet anger det tomma elementet i en samling, dvs. gles.

Prenumeration (varchar) FÖRST ANDRA TREDJE FJÄRDE FEMTE SJÄTTE SJUNDE
Värde (gles) Qwe Asd Afg Asd Vi är

Syntax för index-för-tabell

TYPE  IS TABLE OF  INDEX BY VARCHAR2 (10);
  • I ovanstående syntax deklareras typnamn som en index-för-tabell-samling av typen 'DATA_TYPE'. Datatypen kan vara antingen enkel eller komplex. Subscrt / indexvariabeln ges som VARCHAR2-typ med maximal storlek som 10.

Konstruktör och initialiseringskoncept i samlingar

Konstruktörer är den inbyggda funktionen som tillhandahålls av oraklet som har samma namn som objektet eller samlingarna. De körs först när objekt eller samlingar hänvisas för första gången i en session. Nedan är de viktiga detaljerna för konstruktören i samlingssammanhang:

  • För samlingar bör dessa konstruktörer kallas uttryckligen för att initialisera den.
  • Både tabellerna Varray och Nested måste initieras genom dessa konstruktörer innan de hänvisas till programmet.
  • Constructor utökar implicit minnestilldelningen för en samling (utom Varray), därför kan konstruktören också tilldela variablerna till samlingarna.
  • Tilldelning av värden till samlingen genom konstruktörer kommer aldrig att göra samlingen sparsam.

Insamlingsmetoder

Oracle erbjuder många funktioner för att manipulera och arbeta med samlingarna. Dessa funktioner är mycket användbara i programmet för att bestämma och ändra de olika attributen för samlingarna. Följande tabell ger de olika funktionerna och deras beskrivning.

Metod Beskrivning SYNTAX
EXISTER (n) Den här metoden ger booleska resultat. Det kommer att returnera 'TRUE' om det n: e elementet finns i den samlingen, annars returnerar det FALSE. Endast EXISTS-funktioner kan användas i oinitialiserad samling . EXISTER (elementposition)
RÄKNA Ger det totala antalet element som finns i en samling .COUNT
BEGRÄNSA Den returnerar samlingens maximala storlek. För Varray returnerar den den fasta storleken som har definierats. För nestad tabell och index för tabell ger den NULL .LIMIT
FÖRST Returnerar värdet av den första indexvariabeln (prenumeration) i samlingarna FÖRST
SISTA Returnerar värdet på den sista indexvariabeln (prenumeration) i samlingarna .LAST
FÖREGÅENDE (n) Returnerar före indexvariabel i en samling av det n: e elementet. Om det inte finns något före indexvärdet returneras NULL .PRIOR (n)
NÄSTA (n) Returns lyckas indexvariabel i en samling av det n: e elementet. Om det inte finns något som följer returneras indexvärdet NULL .NEXT (n)
FÖRLÄNGA Utökar ett element i en samling i slutet . EXTEND
UTÖKA (n) Utökar n element i slutet av en samling . EXTEND (n)
UTÖKA (n, i) Sträcker sig n kopior av det i: te elementet i slutet av samlingen .EXTEND (n, i)
TRIM Tar bort ett element från slutet av samlingen .TRIM
TRIM (n) Tar bort n element från slutet av samlingen .TRIM (n)
RADERA Raderar alla element från samlingen. Gör samlingen tom . RADERA
RADERA (n) Tar bort det nionde elementet från samlingen. Om det n: e elementet är NULL, gör detta ingenting . DELETE (n)
RADERA (m, n) Raderar elementet i intervallet m : te till n : te i samlingen . DELETE (m, n)

Exempel 1: Inspelningstyp på underprogramnivå

I det här exemplet ska vi se hur man fyller i samlingen med hjälp av 'BULK COLLECT' och hur man hänvisar samlingsdata.

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

Kodförklaring:

  • Kodrad 2-8 : Posttyp 'emp_det' deklareras med kolumner emp_no, emp_name, lön och chef för datatyp NUMBER, VARCHAR2, NUMBER, NUMBER.
  • Kodrad 9: Skapa samlingen 'emp_det_tbl' för posttypelementet 'emp_det'
  • Kodrad 10: Förklarar variabeln 'guru99_emp_rec' som 'emp_det_tbl' typ och initialiseras med null konstruktör.
  • Kodrad 12-15: Infoga exempeldata i tabellen 'emp'.
  • Kodrad 16: Genomföra insättningstransaktionen.
  • Kodrad 17: Hämta poster från 'emp' -tabellen och fylla i samlingsvariabeln som en bulk med kommandot "BULK COLLECT". Nu innehåller variabeln 'guru99_emp_rec' alla poster som finns i tabellen 'emp'.
  • Kodrad 19-26: Ställa in 'FOR' -slingan för att skriva ut alla poster i samlingen en efter en. Samlingsmetoden FIRST och LAST används som nedre och högre gräns för slingan.

Output : Som du kan se i ovanstående skärmdump när ovanstående kod körs får du följande 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----------------------------------------------