Oracle PL/SQL-samlingar: Varrays, Nested & Index by Tables
Vad är samling?
En samling är en ordnad grupp av element av särskilda datatyper. Det kan vara en samling av enkel datatyp eller komplex datatyp (som användardefinierade eller posttyper).
I samlingen identifieras varje element av en term som kallas "index." Varje föremål i samlingen tilldelas en unik prenumeration. Data i den samlingen kan manipuleras eller hämtas genom att hänvisa till det unika subskriptet.
Samlingar är mest användbara saker när en stor data av samma typ behöver bearbetas eller manipuleras. Samlingar kan fyllas i och manipuleras som helhet med alternativet "BULK" i Oracle.
Samlingar klassificeras baserat på struktur, prenumeration och lagring enligt nedan.
- Index-för-tabeller (även känd som Associative Array)
- Kapslade bord
- Varrays
När som helst kan data i samlingen hänvisas till med tre termer Samlingsnamn, Subscript, Fält-/Kolumnnamn som " ( ). ”. Du kommer att lära dig om dessa ovan nämnda samlingskategorier längre fram i avsnittet nedan.
Varrays
Varray är en insamlingsmetod där storleken på arrayen är fixerad. Matrisstorleken kan inte överskridas än dess fasta värde. Underskriften för Varray har ett numeriskt värde. Följande är attributen för Varrays.
- Övre gränsstorlek är fast
- Fylls sekventiellt med början med sänkningen "1"
- Denna samlingstyp är alltid tät, dvs vi kan inte ta bort några arrayelement. Varray kan tas bort som en helhet, eller så kan den trimmas från slutet.
- Eftersom den alltid är tät i naturen har den mycket mindre flexibilitet.
- Det är mer lämpligt att använda när arraystorleken är känd och att utföra liknande aktiviteter på alla arrayelement.
- Sänkningen och sekvensen förblir alltid stabila, dvs sänkningen och antalet av samlingen är alltid samma.
- De måste initieras innan de används i program. Varje operation (förutom EXISTS-operation) på en oinitierad samling kommer att orsaka ett fel.
- Det kan skapas som ett databasobjekt, som är synligt i hela databasen eller inuti underprogrammet, som endast kan användas i det underprogrammet.
Bilden nedan kommer att förklara minnesallokeringen av Varray (tät) schematiskt.
nedsänkt | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Värderar | xyz | Dfv | Sde | Cxs | Vbc | Mjuk | Qwe |
Syntax för VARRAY:
TYPE <type_name> IS VARRAY (<SIZE>) OF <DATA_TYPE>;
- I ovanstående syntax deklareras typnamn som VARRAY av typen 'DATA_TYPE' för den givna storleksgränsen. Datatypen kan vara antingen enkel eller komplex.
Kapslade tabeller
En kapslad tabell är en samling där storleken på matrisen inte är fixerad. Den har den numeriska subscripttypen. Nedan finns fler beskrivningar om kapslade tabelltyper.
- Det kapslade bordet 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 det. Vi kan utöka samlingen med nyckelordet "EXTEND".
- Fylls i sekventiellt med början med sänkningen "1".
- Denna samlingstyp kan vara av båda tät och gles, dvs vi kan skapa samlingen som en tät, och vi kan också radera det individuella arrayelementet slumpmässigt, vilket gör det så sparsamt.
- Det ger mer flexibilitet när det gäller att ta bort arrayelementet.
- Den lagras i den systemgenererade databastabellen och kan användas i urvalsfrågan för att hämta värdena.
- Sänkningen och sekvensen är inte stabila, dvs sänkningen och antalet av arrayelementet kan variera.
- De måste initieras innan de används i program. Varje operation (förutom EXISTS-operation) på den oinitierade samlingen kommer att orsaka ett fel.
- Det kan skapas som ett databasobjekt, som är synligt i hela databasen eller inuti underprogrammet, som endast kan användas i det underprogrammet.
Bilden nedan kommer att förklara minnesallokeringen av kapslad tabell (tät och sparsam) schematiskt. Det svartfärgade elementutrymmet betecknar det tomma elementet i en samling, dvs sparsamt.
nedsänkt | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Värde (tät) | xyz | Dfv | Sde | Cxs | Vbc | Mjuk | Qwe |
Värde (gles) | Qwe | asd | Afg | asd | Vem |
Syntax för kapslade tabeller:
TYPE <tvpe name> IS TABLE OF <DATA TYPE>;
- 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 arraystorleken inte är fixerad. Till skillnad från de andra samlingstyperna, i samlingen index-för-tabell kan subskriptet bestå av användaren. Följande är attributen för index-för-tabell.
- Den nedsänkta kan av heltal eller strängar. När samlingen skapas ska abonnemangstypen anges.
- Dessa samlingar lagras inte sekventiellt.
- De är alltid glesa i naturen.
- Arraystorleken är inte fast.
- De kan inte lagras i databaskolumnen. De ska skapas och användas i vilket program som helst under den särskilda sessionen.
- De ger mer flexibilitet när det gäller att behålla prenumeration.
- Sänkningarna kan också ha negativ sekvens.
- 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 underprogram.
- De behöver inte initieras innan de börjar användas.
- Det kan inte skapas som ett databasobjekt. Det kan bara skapas i underprogrammet, som endast kan användas i det underprogrammet.
- BULK COLLECT kan inte användas i denna samlingstyp eftersom subskriptet ska anges uttryckligen för varje post i samlingen.
Bilden nedan kommer att förklara minnesallokeringen av Nested Table (gles) schematiskt. Det svartfärgade elementutrymmet betecknar det tomma elementet i en samling, dvs sparsamt.
Subscription (varchar) | FÖRST | ANDRA | TREDJE | FJÄRDE | FEMTE | SJÄTTE | SJUNDE |
Värde (gles) | Qwe | asd | Afg | asd | Vem |
Syntax för index för tabell
TYPE <type_name> IS TABLE OF <DATA_TYPE> 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. Subsciprt/index-variabeln anges som VARCHAR2-typ med maximal storlek som 10.
Konstruktör och initieringskoncept i samlingar
Konstruktörer är den inbyggda funktionen som tillhandahålls av oraklet som har samma namn som objektet eller samlingarna. De exekveras först när objekt eller samlingar hänvisas för första gången i en session. Nedan är de viktiga detaljerna om konstruktör i samlingssammanhang:
- För samlingar bör dessa konstruktörer anropas uttryckligen för att initiera den.
- Både Varray- och Nested-tabeller måste initieras genom dessa konstruktörer innan de hänvisas till programmet.
- Constructor utökar implicit minnesallokeringen för en samling (förutom Varray), därför kan konstruktorn också tilldela variablerna till samlingarna.
- Att tilldela samlingen värden genom konstruktörer kommer aldrig att göra samlingen gles.
Insamlingsmetoder
Oracle ger många funktioner att manipulera och arbeta med samlingarna. Dessa funktioner är mycket användbara i programmet för att bestämma och ändra samlingarnas olika attribut. Följande tabell ger de olika funktionerna och deras beskrivning.
Metod | Description | SYNTAX |
---|---|---|
FINNS (n) | Denna metod kommer att returnera booleska resultat. Det kommer att returnera 'TRUE' om nth elementet finns i den samlingen, annars kommer det att returnera FALSE. Endast EXISTS-funktioner kan användas i oinitierad samling | .EXISTS(element_position) |
RÄKNA | Ger det totala antalet element som finns i en samling | .RÄKNA |
BEGRÄNSA | Det returnerar den maximala storleken på samlingen. För Varray kommer den att returnera den fasta storleken som har definierats. För kapslade tabeller och Index-för-tabell ger det NULL | .BEGRÄNSA |
FÖRST | Returnerar värdet för den första indexvariabeln (nedsänkt) i samlingarna | .FÖRST |
SISTA | Returnerar värdet för den sista indexvariabeln (nedsänkt) i samlingarna | .SISTA |
FÖREGÅENDE (n) | Returnerar föregår indexvariabel i en samling av nth element. Om det inte finns några föregångar returneras indexvärdet NULL | .PRIOR(n) |
NÄSTA (n) | Returnerar efterträder indexvariabel i en samling av nth element. Om det inte finns något lyckas returneras indexvärdet NULL | .NEXT(n) |
UTÖKA | Förlänger ett element i en samling i slutet | .FÖRLÄNGA |
FÖRLÄNG (n) | Utökar n element i slutet av en samling | .EXTEND(n) |
FÖRLÄNG (n,i) | Utökar n kopior av ith element i slutet av samlingen | .EXTEND(n,i) |
TRIM | Tar bort ett element från slutet av samlingen | .TRIM |
TRIMMA (n) | Tar bort n element från slutet av samlingen | .TRIM (n) |
RADERA | Tar bort alla element från samlingen. Gör samlingen tom | .RADERA |
DELETE (n) | Tar bort det n:e elementet från samlingen. Om dåth elementet är NULL, då gör detta ingenting | .DELETE(n) |
DELETE (m,n) | Tar bort elementet i området mth till nth i samlingen | .DELETE(m,n) |
Exempel 1: Inspelningstyp på underprogramnivå
I det här exemplet ska vi se hur man fyller i samlingen med 'MASSAMLA' och hur man hänvisar insamlingsdata.
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; /
Kodförklaring:
- Kodrad 2-8: Inspelningstyp 'emp_det' deklareras med kolumnerna emp_no, emp_name, lön och manager av datatyp NUMBER, VARCHAR2, NUMBER, NUMBER.
- Kodrad 9: Skapar samlingen 'emp_det_tbl' av posttypelementet 'emp_det'
- Kodrad 10: Deklarerar variabeln 'guru99_emp_rec' som 'emp_det_tbl'-typ och initieras med null-konstruktorn.
- Kodrad 12-15: Infoga exempeldata i 'emp'-tabellen.
- Kodrad 16: Begår infogningstransaktionen.
- Kodrad 17: Hämta posterna 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'-loopen med att skriva ut alla poster i samlingen en i taget. Insamlingsmetoden FIRST och LAST används som lägre och högre gräns för slinga.
Produktion: Som du kan se i skärmdumpen ovan när ovanstående kod exekveras får du följande utdata
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 ----------------------------------------------