Hvad er samling?
En samling er en ordnet gruppe af elementer af bestemte datatyper. Det kan være en samling af enkel datatype eller kompleks datatype (som brugerdefinerede eller posttyper).
I samlingen identificeres hvert element med et udtryk kaldet "abonnement". Hvert element i samlingen tildeles et unikt abonnement. Dataene i denne samling kan manipuleres eller hentes ved at henvise til det unikke abonnement.
Samlinger er mest nyttige ting, når store data af samme type skal behandles eller manipuleres. Samlinger kan udfyldes og manipuleres som helhed ved hjælp af 'BULK' i Oracle.
I denne vejledning lærer du-
- Hvad er samling?
- Varianter
- Indlejrede tabeller
- Indeks-for-tabel
- Konstruktør og initialiseringskoncept i samlinger
- Indsamlingsmetoder
Samlinger klassificeres baseret på struktur, abonnement og opbevaring som vist nedenfor.
- Indeks-ved-tabeller (også kendt som Associative Array)
- Indlejrede tabeller
- Varianter
På ethvert tidspunkt kan data i samlingen henvises med tre udtryk Samlingsnavn, abonnement, felt / kolonnenavn som "
Varianter
Varray er en samlingsmetode, hvor størrelsen på arrayet er fast. Arraystørrelsen kan ikke overskrides end dens faste værdi. Abonnementet på Varray har en numerisk værdi. Følgende er Varrays attributter.
- Øvre grænsestørrelse er fast
- Befolket sekventielt startende med abonnementet '1'
- Denne samlingstype er altid tæt, dvs. vi kan ikke slette nogen matrixelementer. Varray kan slettes som en helhed, eller det kan trimmes fra slutningen.
- Da det altid er tæt i naturen, har det meget mindre fleksibilitet.
- Det er mere passende at bruge, når arraystørrelsen er kendt, og at udføre lignende aktiviteter på alle arrayelementerne.
- Abonnementet og sekvensen forbliver altid stabile, dvs. abonnementet og antallet af samlingen er altid det samme.
- De skal initialiseres, inden de bruges i programmer. Enhver handling (undtagen EXISTS-handling) på en ikke-initialiseret samling vil kaste en fejl.
- Det kan oprettes som et databaseobjekt, der er synligt i hele databasen eller inde i underprogrammet, som kun kan bruges i det underprogram.
Nedenstående figur forklarer hukommelsesallokeringen af Varray (tæt) diagrammatisk.
Abonnement | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Værdi | Xyz | Dfv | Sde | Cxs | Vbc | Nhu | Qwe |
Syntaks til VARRAY:
TYPEIS VARRAY ( ) OF ;
- I ovenstående syntaks erklæres typenavn som VARRAY af typen 'DATA_TYPE' for den givne størrelsesgrænse. Datatypen kan være enten simpel eller kompleks.
Indlejrede tabeller
En indlejret tabel er en samling, hvor arrayets størrelse ikke er fast. Det har den numeriske abonnementstype. Nedenfor er flere beskrivelser af indlejret bordtype.
- Den indlejrede tabel har ingen øvre størrelsesgrænse.
- Da den øvre størrelsesgrænse ikke er fast, skal samlingen, hukommelsen udvides hver gang, før vi bruger den. Vi kan udvide samlingen ved hjælp af 'EXTEND' nøgleord.
- Befolket sekventielt startende med abonnementet '1'.
- Denne samlingstype kan være både tæt og sparsom , dvs. vi kan oprette samlingen som en tæt, og vi kan også slette det enkelte array-element tilfældigt, hvilket gør det som sparsomt.
- Det giver mere fleksibilitet med hensyn til sletning af matrixelementet.
- Den er gemt i den systemgenererede databasetabel og kan bruges i selve forespørgslen til at hente værdierne.
- Subskriptet og sekvensen er ikke stabile, dvs. abonnementet og antallet af array-elementet kan variere.
- De skal initialiseres, inden de bruges i programmer. Enhver handling (undtagen EXISTS-handling) på den ikke-initialiserede samling vil medføre en fejl.
- Det kan oprettes som et databaseobjekt, der er synligt i hele databasen eller inde i underprogrammet, som kun kan bruges i det underprogram.
Nedenstående figur forklarer hukommelsesallokeringen af den indlejrede tabel (tæt og sparsom) diagrammatisk. Det sortfarvede elementrum angiver det tomme element i en samling, dvs. sparsomt.
Abonnement | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Værdi (tæt) | Xyz | Dfv | Sde | Cxs | Vbc | Nhu | Qwe |
Værdi (sparsom) | Qwe | Asd | Afg | Asd | Wer |
Syntaks for indlejret tabel:
TYPEIS TABLE OF ;
- I ovenstående syntaks erklæres typenavn som indlejret tabelindsamling af typen 'DATA_TYPE'. Datatypen kan være enten simpel eller kompleks.
Indeks-for-tabel
Indeks efter tabel er en samling, hvor matrixstørrelsen ikke er fast. I modsætning til de andre samlingstyper kan abonnementet i indeks-for-tabel-samlingen bestå af brugeren. Følgende er attributterne for indeks for tabel.
- Abonnementet kan have heltal eller strenge. På tidspunktet for oprettelsen af samlingen skal abonnementstypen nævnes.
- Disse samlinger gemmes ikke sekventielt.
- De er altid sparsomme i naturen.
- Arraystørrelsen er ikke fast.
- De kan ikke gemmes i databasekolonnen. De oprettes og bruges i ethvert program i den pågældende session.
- De giver mere fleksibilitet med hensyn til vedligeholdelse af abonnement.
- Abonnementerne kan også have negativ tegnsekvens.
- De er mere passende at bruge til relativt mindre kollektive værdier, hvor samlingen kan initialiseres og bruges inden for de samme underprogrammer.
- De behøver ikke initialiseres, før de begynder at bruge dem.
- Det kan ikke oprettes som et databaseobjekt. Det kan kun oprettes inde i underprogrammet, som kun kan bruges i det underprogram.
- BULK COLLECT kan ikke bruges i denne samlingstype, da abonnementet skal gives eksplicit for hver post i samlingen.
Nedenstående figur forklarer hukommelsesallokeringen af Nested Table (sparsom) diagrammatisk. Det sortfarvede elementrum angiver det tomme element i en samling, dvs. sparsomt.
Abonnement (varchar) | FØRST | SEKUND | TREDJE | FJERDE | Femte | SJETTE | SYVENDE |
Værdi (sparsom) | Qwe | Asd | Afg | Asd | Wer |
Syntaks til indeks-for-tabel
TYPEIS TABLE OF INDEX BY VARCHAR2 (10);
- I ovenstående syntaks erklæres typenavn som en indeks-for-tabel samling af typen 'DATA_TYPE'. Datatypen kan være enten simpel eller kompleks. Subscrt / indeksvariablen er angivet som VARCHAR2-type med maksimal størrelse som 10.
Konstruktør og initialiseringskoncept i samlinger
Konstruktører er den indbyggede funktion leveret af oraklet, der har samme navn som objektet eller samlingerne. De udføres først, når objekt eller samlinger henvises for første gang i en session. Nedenfor er de vigtige detaljer om konstruktør i samlingskontekst:
- For samlinger skal disse konstruktører kaldes eksplicit for at initialisere det.
- Både Varray- og Nested-tabeller skal initialiseres gennem disse konstruktører, før de bliver henvist til programmet.
- Constructor udvider implicit hukommelsestildelingen til en samling (undtagen Varray), og derfor kan konstruktøren også tildele variablerne til samlingerne.
- Tildeling af værdier til samlingen gennem konstruktører vil aldrig gøre samlingen sparsom.
Indsamlingsmetoder
Oracle har mange funktioner til at manipulere og arbejde med samlingerne. Disse funktioner er meget nyttige i programmet til at bestemme og ændre de forskellige egenskaber ved samlingerne. Den følgende tabel giver de forskellige funktioner og deres beskrivelse.
Metode | Beskrivelse | SYNTAX |
EKSISTER (n) | Denne metode returnerer boolske resultater. Det returnerer 'TRUE', hvis det nte element findes i denne samling, ellers returnerer det FALSE. Kun EXISTS-funktioner kan bruges i ikke-initialiseret samling | |
TÆLLE | Giver den samlede optælling af de elementer, der er til stede i en samling | |
BEGRÆNSE | Den returnerer den maksimale størrelse på samlingen. For Varray returnerer den den definerede faste størrelse. For indlejret tabel og indeks efter tabel giver det NULL | |
FØRST | Returnerer værdien af samlingens første indeksvariabel (abonnement) | |
SIDST | Returnerer værdien af samlingens sidste indeksvariabel (abonnement) | |
FORRIGE (n) | Returnerer forud for indeksvariabler i en samling af det n - element. Hvis der ikke er nogen forud for indeksværdien, returneres NULL | |
NÆSTE (n) | Returnerer efterfølgende indeksvariabel i en samling af det n - element. Hvis der ikke er nogen efterfølgende indeksværdi, returneres NULL | |
FORLÆNGE | Udvider et element i en samling i slutningen | |
UDVIDE (n) | Udvider n elementer i slutningen af en samling | |
UDVIDER (n, i) | Strækker n kopier af i th ved enden af samlingen | |
TRIMME | Fjerner et element fra slutningen af samlingen | |
TRIM (n) | Fjerner n elementer fra slutningen af samlingen | |
SLET | Sletter alle elementerne fra samlingen. Gør samlingen tom | |
SLET (n) | Sletter det niende element fra samlingen. Hvis det niende element er NULL, vil dette ikke gøre noget | |
SLET (m, n) | Sletter elementet i området m th til n th i samlingen |
Eksempel 1: Optagetype på underprogramniveau
I dette eksempel skal vi se, hvordan samlingen skal udfyldes ved hjælp af 'BULK COLLECT', og hvordan man henviser indsamlingsdataene.
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;/
Kode Forklaring:
- Kodelinje 2-8 : Registreringstype 'emp_det' erklæres med kolonner emp_no, emp_name, løn og manager af datatypen NUMBER, VARCHAR2, NUMBER, NUMBER.
- Kodelinje 9: Oprettelse af samlingen 'emp_det_tbl' af posttypeelementet 'emp_det'
- Kodelinje 10: Erklæring om variablen 'guru99_emp_rec' som 'emp_det_tbl' type og initialiseret med null konstruktør.
- Kodelinje 12-15: Indsættelse af eksempeldataene i 'emp' -tabellen.
- Kodelinje 16: Foretag indsættelsestransaktionen.
- Kodelinje 17: Henter poster fra 'emp' -tabellen og udfylder samlingsvariablen som en bulk ved hjælp af kommandoen "BULK COLLECT". Nu indeholder variablen 'guru99_emp_rec' alle de poster, der er til stede i tabellen 'emp'.
- Kodelinje 19-26: Indstilling af 'FOR' -sløjfen ved at udskrive alle poster i samlingen en efter en. Samlingsmetoden FIRST og LAST bruges som nedre og højere grænse for sløjfen.
Output : Som du kan se i ovenstående skærmbillede, når ovenstående kode udføres, får du følgende output
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----------------------------------------------