Oracle PL/SQL-samlingar: Varrays, Nested & Index by Tables

โšก Smart sammanfattning

PL/SQL-samlingar รคr ordnade grupper av element av samma datatyp, som vart och ett nรฅs via ett subskript. Tre typer, Varray, kapslad tabell och indexerad tabell, skiljer sig รฅt i huruvida storleken รคr fast, hur subskriptet fungerar och om de kan lagras i databasen.

  • ๐Ÿงบ Definition: En samling innehรฅller mรฅnga element av en typ, som vart och ett identifieras med ett unikt subskript.
  • ๐Ÿ“ Varray: Fast รถvre storlek, alltid tรคt, numerisk nedsรคnkt skrift, mรฅste initieras fรถre anvรคndning.
  • ๐Ÿ“š Kapslad tabell: Ingen storleksgrรคns, kan vara tรคt eller gles, lagras i en systemtabell, utรถkad med EXTEND.
  • ๐Ÿ”‘ Indexerad efter tabell: Ingen storleksgrรคns, nedsรคnkt kod kan vara en strรคng eller ett negativt heltal, lagras inte i databasen.
  • ๐Ÿ—๏ธ Byggare: Varray och kapslade tabeller behรถver en explicit konstruktor fรถr att initialiseras fรถre referens.
  • ๐Ÿ› ๏ธ Metoder: COUNT, EXISTS, FIRST, LAST, EXTEND, TRIM och DELETE hanterar en samling.
  • โšก Bulk: BULK COLLECT fyller i en samling i ett steg fรถr snabb bearbetning.

Oracle PL/SQL-samlingar

Vad รคr en samling?

En samling รคr en ordnad grupp av element av en viss datatyp. Det kan vara en samling av en enkel datatyp eller en komplex datatyp, sรฅsom anvรคndardefinierade datatyper eller posttyper.

I en samling identifieras varje element med en term som kallas en "index." Varje objekt tilldelas ett unikt prenumerationsnummer, och informationen kan manipuleras eller hรคmtas genom att hรคnvisa till det unika prenumerationsnummeret.

Samlingar รคr mest anvรคndbara nรคr en stor mรคngd data av samma typ behรถver bearbetas eller manipuleras. Samlingar kan fyllas i och manipuleras som en helhet med hjรคlp av alternativet 'BULK' i Oracle.

Samlingar klassificeras baserat pรฅ struktur, prenumeration och lagring, enligt nedan:

  • Indexerade tabeller (รคven kรคnda som associativa arrayer)
  • Kapslade bord
  • Varrays

Data i en samling kan nรคr som helst betecknas med tre termer: samlingsnamn, prenumeration och fรคlt- eller kolumnnamn, som " ( ). Du kommer att lรคra dig mer om dessa samlingskategorier i avsnitten nedan.

Samlingstyper i korthet

De tre samlingstyperna gรถr olika avvรคgningar. Tabellen nedan presenterar dem sida vid sida innan var och en behandlas i detalj.

Aspect Varray Kapslad tabell Indexera efter tabell
Storlek Fast รถvre grรคns Ingen begrรคnsning Ingen begrรคnsning
nedsรคnkt Numerisk Numerisk Heltal eller strรคng
Densitet Alltid tรคt Tรคt eller gles Alltid gles
Lagras i databasen Ja Ja Nej
Behรถver initialiseras Ja Ja Nej

Varrays

En Varray รคr en samling dรคr arrayens storlek รคr fast och inte kan รถverskridas. Indexet fรถr en Varray รคr ett numeriskt vรคrde. Attributen fรถr Varrays รคr:

  • Den รถvre grรคnsstorleken รคr fast.
  • Ifylls sekventiellt med bรถrjan med nedsรคnkt '1'.
  • Denna samlingstyp รคr alltid tรคt; vi kan inte ta bort enskilda arrayelement. En Varray kan tas bort som helhet eller trimmas frรฅn slutet.
  • Eftersom den alltid รคr tรคt har den vรคldigt liten flexibilitet.
  • Det รคr mer lรคmpligt nรคr arraystorleken รคr kรคnd och liknande aktiviteter utfรถrs pรฅ alla element.
  • Samlingens prenumeration och antal fรถrblir alltid stabila.
  • Den mรฅste initieras fรถre anvรคndning. Alla operationer fรถrutom EXISTS pรฅ en oinitialiserad samling genererar ett fel.
  • Den kan skapas som ett databasobjekt som รคr synligt i hela databasen, eller inuti ett underprogram fรถr anvรคndning endast dรคr.

Figuren nedan fรถrklarar minnesallokeringen fรถr en Varray (tรคt).

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 syntaxen ovan deklareras type_name som en 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 arrayens storlek inte รคr fast. Den har en numerisk nedsรคnkt tabelltyp. Mer om den kapslade tabelltypen:

  • Den kapslade tabellen har ingen รถvre storleksgrรคns.
  • Eftersom den รถvre grรคnsen inte รคr fast mรฅste minnet utรถkas varje gรฅng fรถre anvรคndning med hjรคlp av nyckelordet 'EXTEND'.
  • Ifylls sekventiellt med bรถrjan med nedsรคnkt '1'.
  • Denna samlingstyp kan vara bรฅde tรคt och gles; vi kan skapa den som tรคt och รคven ta bort enskilda element slumpmรคssigt, vilket gรถr den gles.
  • Det ger mer flexibilitet fรถr att ta bort arrayelement.
  • Den lagras i en systemgenererad databastabell och kan anvรคndas i en urvalsfrรฅga fรถr att hรคmta vรคrden.
  • Prenumerationen och antalet kan variera.
  • Den mรฅste initieras fรถre anvรคndning. Alla operationer fรถrutom EXISTS pรฅ en oinitialiserad samling genererar ett fel.
  • Den kan skapas som ett databasobjekt som รคr synligt i hela databasen, eller inuti ett underprogram fรถr anvรคndning endast dรคr.

Figuren nedan fรถrklarar minnesallokeringen fรถr en kapslad tabell (tรคt och gles). Ett tomt elementutrymme betecknar ett gles element.

nedsรคnkt 1 2 3 4 5 6 7
Vรคrde (tรคt) xyz Dfv Sde Cxs Vbc Mjuk Qwe
Vรคrde (glest) Qwe asd Afg asd Vem

Syntax fรถr kapslade tabeller:

TYPE <type_name> IS TABLE OF <DATA_TYPE>;
  • I syntaxen ovan deklareras type_name som en kapslad tabellsamling av typen 'DATA_TYPE'. Datatypen kan vara antingen enkel eller komplex.

Indexera efter tabell

En indexerad tabell รคr en samling dรคr arraystorleken inte รคr fast. Till skillnad frรฅn andra samlingstyper kan indexet fรถr en indexerad tabell definieras av anvรคndaren. Attributen fรถr en indexerad tabell รคr:

  • Subskriptet kan vara ett heltal eller en strรคng. Subskripttypen bรถr anges nรคr samlingen skapas.
  • Dessa samlingar lagras inte sekventiellt.
  • De รคr alltid glesa i naturen.
  • Arraystorleken รคr inte fast.
  • De kan inte lagras i en databaskolumn. De skapas och anvรคnds inom en viss session.
  • De ger mer flexibilitet i att underhรฅlla prenumerationen.
  • Indexen kan vara en negativ sekvens.
  • De รคr mer lรคmpliga fรถr relativt mindre samlingsvรคrden som anvรคnds inom samma delprogram.
  • De behรถver inte initialiseras fรถre anvรคndning.
  • De kan inte skapas som ett databasobjekt; de skapas endast inuti ett underprogram.
  • BULK COLLECT kan inte anvรคndas med den hรคr samlingstypen, eftersom prenumerationen mรฅste anges explicit fรถr varje post.

Figuren nedan fรถrklarar minnesallokeringen fรถr en indexerad tabell (sparse). Ett tomt elementutrymme betecknar ett sparse-element.

Subscription (varchar) Fร–RST ANDRA TREDJE FJร„RDE FEMTE SJร„TTE SJUNDE
Vรคrde (glest) Qwe asd Afg asd Vem

Syntax fรถr indexering efter tabell:

TYPE <type_name> IS TABLE OF <DATA_TYPE> INDEX BY VARCHAR2 (10);
  • I syntaxen ovan deklareras type_name som en indexerad tabellsamling av typen 'DATA_TYPE'. Subscriptvariabeln anges av typen VARCHAR2 med en maximal storlek pรฅ 10.

Konstruktรถr och initieringskoncept i samlingar

Konstruktorer รคr inbyggda funktioner som tillhandahรฅlls av Oracle som har samma namn som objektet eller samlingen. De kรถrs fรถrst varje gรฅng ett objekt eller en samling refereras till fรถr fรถrsta gรฅngen i en session. Viktiga detaljer om en konstruktor i samlingskontexten:

  • Fรถr samlingar mรฅste dessa konstruktorer anropas explicit fรถr att initiera samlingen.
  • Bรฅde Varray- och kapslade tabeller mรฅste initieras genom dessa konstruktorer innan de refereras till i programmet.
  • En konstruktor utรถkar implicit minnesallokeringen fรถr en samling (fรถrutom Varray), sรฅ den kan ocksรฅ tilldela variabler till samlingen.
  • Att tilldela vรคrden genom konstruktรถrer gรถr aldrig samlingen gles.

Insamlingsmetoder

Oracle erbjuder mรฅnga funktioner fรถr att manipulera och arbeta med samlingar. Dessa funktioner bestรคmmer och modifierar de olika attributen fรถr en samling. Tabellen nedan visar de olika funktionerna och deras beskrivningar.

Metod BESKRIVNING syntax
FINNS (n) Returnerar ett booleskt resultat. Returnerar TRUE om det n:te elementet existerar, annars FALSE. Endast EXISTS kan anvรคndas pรฅ en oinitialiserad samling. .EXISTS(element_position)
Rร„KNA Anger det totala antalet element som finns i en samling. .Rร„KNA
BEGRร„NSA Returnerar samlingens maximala storlek. Fรถr Varray returnerar den den fasta storleken; fรถr kapslade och indexerade tabeller returnerar den NULL. .BEGRร„NSA
Fร–RST Returnerar vรคrdet fรถr samlingens fรถrsta subskript. .Fร–RST
SISTA Returnerar vรคrdet fรถr samlingens sista index. .SISTA
Fร–REGร…ENDE (n) Returnerar fรถregรฅende subskript fรถr det n:te elementet. Om inget returneras NULL. .PRIOR(n)
Nร„STA (n) Returnerar det efterfรถljande subskriptet fรถr det n:te elementet. Om inget returneras NULL. .NEXT(n)
UTร–KA Utรถkar ett element i slutet av en samling. .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 det i:te elementet 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, vilket gรถr den tom. .RADERA
DELETE (n) Tar bort det n:te elementet. Om det n:te elementet รคr NULL, gรถrs ingenting. .DELETE(n)
DELETE (m,n) Tar bort elementen i intervallet mth till nth i samlingen. .DELETE(m,n)

Exempel 1: Posttyp pรฅ underprogramnivรฅ

I det hรคr exemplet ser vi hur man fyller samlingen med hjรคlp av 'MASSAMLAoch hur man hรคnvisar till samlingsdata.

PL/SQL-samling ifylld med BULK COLLECT-exempel

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

Code Fรถrklaring

  • Code rad 2-8: Inspelningstyp 'emp_det' deklareras med kolumnerna emp_no, emp_name, manager och salary av datatyperna NUMBER, VARCHAR2, NUMBER och NUMBER.
  • Code rad 9: Skapar samlingen 'emp_det_tbl' av posttypelementet 'emp_det'.
  • Code rad 10: Deklarerar variabeln 'guru99_emp_rec' som typen 'emp_det_tbl' och initierar den med en nullkonstruktor.
  • Code rad 12-15: Infoga exempeldata i 'emp'-tabellen.
  • Code rad 16: Begรฅr infogningstransaktionen.
  • Code rad 17: Hรคmtar posterna frรฅn tabellen 'emp' och fyller i samlingsvariabeln i bulk med hjรคlp av "BULK COLLECT". Variabeln 'guru99_emp_rec' innehรฅller nu alla poster som finns i tabellen 'emp'.
  • Code rad 19-26: Stรคller in 'FOR'-loopen fรถr att skriva ut alla poster i samlingen en efter en. Insamlingsmetoderna FIRST och LAST anvรคnds som nedre och รถvre grรคnser fรถr slinga.

Produktion: Nรคr ovanstรฅende kod kรถrs 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
----------------------------------------------

Vanliga frรฅgor

En Varray har en fast รถvre storlek och รคr alltid tรคt. En kapslad tabell har ingen storleksgrรคns, kan vara gles och kan utรถkas, vilket gรถr den mer flexibel fรถr vรคxande eller luckiga data.

Eftersom det รคr en associativ array i minnet, inte en lagrad tabell. Subskriptet fungerar som en sรถknyckel, sรฅ en strรคng eller ett negativt heltal fungerar, vilket รคr anvรคndbart fรถr nycklade sรถkningar inom en session.

En oinitialiserad Varray eller kapslad tabell รคr atomiskt null, sรฅ att referera till ett element genererar ett fel. Anrop av konstruktorn allokerar det, varefter EXTEND och tilldelningar kan lรคgga till data.

Ja. Givet om storleken รคr fast, om data lagras och om en strรคngnyckel behรถvs, kan AI peka pรฅ en Varray, kapslad tabell eller index-by-tabell och fรถrklara avvรคgningen.

BULK COLLECT laddar alla rader till en samling i en enda kontextvรคxling mellan SQL- och PL/SQL-motorerna, istรคllet fรถr en vรคxling per rad, vilket avsevรคrt minskar overhead pรฅ stora resultatmรคngder.

Sammanfatta detta inlรคgg med: