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.

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

