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

Inspelningstyp pรฅ underprogramnivรฅ

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

Sammanfatta detta inlรคgg med: