PL /SQL Collections

En samling er en ordnet gruppe av elementer som har samme datatype. Hvert element er identifisert av en unik indeks som representerer sin posisjon i samlingen.

PL /SQL gir tre innsamlingstyper:

Index-by tabeller eller assosiativ array

nestet tabell

Variable-size matrise eller Varray

Oracle dokumentasjon gir følgende egenskaper for hver type samlinger:
Collection Type
Antall Elements
Senket Type
Tett eller Sparse
Hvor Laget
Kan være Object Type Egenskap
assosiative array (eller indeks ved bordet) UnboundedString eller integerEitherOnly i PL /SQL blockNoNested tableUnboundedIntegerStarts tette, kan bli sparseEither i PL /SQL blokk eller på skjema levelYesVariable-size array (Varray) BoundedIntegerAlways denseEither i PL /SQL blokk eller på skjema levelYes

Vi har allerede diskutert varray i kapitlet ' PL /SQL arrays ". I dette kapittelet vil vi diskutere PL /SQL-tabeller.

Begge typer PL /SQL-tabeller, dvs. indeksen ved tabeller og nestede tabeller har samme struktur og deres rekker du får tilgang til ved å bruke senket notasjon. Men disse to typer tabeller forskjellige i ett aspekt; de nestede tabeller kan lagres i en database kolonne og indeksen ved tabeller kan ikke.

Index-By Table

indeks av
tabell (også kalt en assosiativ array) er et sett med nøkkelverdien
parene. Hver tast er unik, og brukes til å finne den tilsvarende verdi. Nøkkelen kan enten være et heltall eller en streng.

En indeks-by bordet er opprettet ved hjelp av følgende syntaks. Her skaper vi en indeks-by tabell med navnet table_name
hvis nøklene vil være av subscript_type Hotell og tilknyttede verdiene vil være av ELEMENT_TYPE
TYPE TYPE_NAME er bord AV ELEMENT_TYPE [NOT NULL] indeksen med subscript_type; table_name TYPE_NAME;
Eksempel:

Følgende eksempel viser hvordan du oppretter en tabell for å lagre heltallsverdiene sammen med navn og senere skriver den samme listen med navn <. br> ERKLÆRER TYPE lønn ER FORTEGN NUMMER indeksen med VARCHAR2 (20); salary_list lønn; nevne VARCHAR2 (20), BEGIN - legge til elementer til bordet salary_list ('Rajnish'): = 62000; salary_list ('Minakshi'): = 75000; salary_list ('Martin'): = 100000; salary_list ('James'): = 78000; - Utskrift tabellnavnet: = salary_list.FIRST; MENS navn ikke er null LOOP dbms_output.put_line ('Lønn fra' || navn || 'er' || TO_CHAR (salary_list (navn))); name: = salary_list.NEXT (navn); END LOOP; END; /

Når ovenfor koden kjøres på SQL teksten, gir det følgende resultat:
Lønn fra Rajnish er 62000Salary av Minakshi er 75000Salary av Martin er 100000Salary av James er 78000PL /SQL-prosedyren ble fullført .
Eksempel:

Elementer i en indeks-by bord kan også være en% ROWTYPE av noen databasetabell eller% TYPE av noen databasetabell feltet. Det følgende eksempel illustrerer konseptet. Vi vil bruke KUNDER tabell lagret i vår database som:
Velg * fra kunder; + ---- + ---------- + ----- + ------- ---- + ---------- + | ID | NAME | AGE | ADRESSE | LØNN | + ---- + ---------- + ----- + ----------- + ---------- + | 1 | Ramesh | 32 | Ahmedabad | 2000.00 || 2 | Khilan | 25 | Delhi | 1500.00 || 3 | Kaushik | 23 | Kota | 2000.00 || 4 | Chaitali | 25 | Mumbai | 6500.00 || 5 | Hardik | 27 | Bhopal | 8500.00 || 6 | Komal | 22 | MP | 4500.00 | + ---- + ---------- + ----- + ----------- + ---------- + ERKLÆRER CURSOR c_customers er å velge navn fra kunder; TYPE c_list ER TABLE av customers.name% typen indeksen med binary_integer; NAME_LIST c_list; teller heltall: = 0; BEGIN for N i c_customers LOOP teller: = teller 1; NAME_LIST (counter): = n.name; dbms_output.put_line ('Customer (' || teller || '):' || NAME_LIST (counter)); END LOOP; END; /

Når ovenfor koden kjøres på SQL teksten, gir det følgende resultat:
Customer (1): Ramesh Kunde (2): Khilan Customer (3): Kaushik Customer (4) : Chaitali Customer (5): Hardik Customer (6): KomalPL /SQL-prosedyren ble fullført
nestede tabeller

En nestet tabell
er som en endimensjonal matrise med et vilkårlig antall av elementer. Imidlertid skiller en nestet tabell fra en matrise i følgende aspekter:

En matrise har en erklært antall elementer, men en nestet tabell ikke. Størrelsen på en nestet tabell kan øke dynamisk.

  • En rekke er alltid tett, dvs. den alltid har gjort sammenhengende senket. En nestet matrise er tett i utgangspunktet, men det kan bli sparsom når elementene blir slettet fra det

    En nestet tabell
    er opprettet ved hjelp av følgende syntaks:.
    TYPE TYPE_NAME ER FORTEGN ELEMENT_TYPE [NOT NULL]; table_name TYPE_NAME;

    Denne erklæringen er lik erklæring om en indeks av
    bord, men det er ingen INDEX BY klausulen

    . En nestet tabell kan lagres i en database kolonne og slik at den kan brukes for å forenkle SQL operasjoner hvor en tabell enkelt kolonne med en større tabell du delta. En assosiativ array kan ikke lagres i databasen

    Eksempel:

    Følgende eksempler illustrerer bruk av nestet tabell.
    ERKLÆRER TYPE names_table ER FORTEGN VARCHAR2 (10); TYPE karakterer ER FORTEGN INTEGER; Navnene names_table; markerer karakterer; total heltall; BEGIN navn: = names_table ('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz'); merker: = karakterer (98, 97, 78, 87, 92); Totalt: = names.count; dbms_output.put_line ('Total' || total || 'Students'); For jeg IN 1 .. total LOOP dbms_output.put_line ('Student:' || navn (i) || ', Marks:' || merker (i)); end sløyfe, END; /

    Når ovenfor koden kjøres på SQL teksten, gir det følgende resultat:
    Totalt fem StudentsStudent: Kavita, Marks: 98Student: Pritam, Marks: 97Student: Ayan, Marks: 78Student: Rishav, Marks: 87Student: Aziz, Marks. 92PL /SQL-prosedyren ble fullført
    Eksempel:

    Elementer av en nestet tabell
    kan også være en% ROWTYPE av noen databasetabell eller % TYPE av noen databasetabell feltet. Det følgende eksempel illustrerer konseptet. Vi vil bruke KUNDER tabell lagret i vår database som:
    Velg * fra kunder; + ---- + ---------- + ----- + ------- ---- + ---------- + | ID | NAME | AGE | ADRESSE | LØNN | + ---- + ---------- + ----- + ----------- + ---------- + | 1 | Ramesh | 32 | Ahmedabad | 2000.00 || 2 | Khilan | 25 | Delhi | 1500.00 || 3 | Kaushik | 23 | Kota | 2000.00 || 4 | Chaitali | 25 | Mumbai | 6500.00 || 5 | Hardik | 27 | Bhopal | 8500.00 || 6 | Komal | 22 | MP | 4500.00 | + ---- + ---------- + ----- + ----------- + ---------- + ERKLÆRER CURSOR c_customers er SELECT navn FROM kunder; TYPE c_list ER TABLE av customers.name% type; NAME_LIST c_list: = c_list (); teller heltall: = 0; BEGIN for N i c_customers LOOP teller: = teller 1; name_list.extend; NAME_LIST (counter): = n.name; dbms_output.put_line ('Customer (' || teller || '):' || NAME_LIST (counter)); END LOOP; END; /

    Når ovenfor koden kjøres på SQL teksten, gir det følgende resultat:
    Customer (1): Ramesh Kunde (2): Khilan Customer (3): Kaushik Customer (4) : Chaitali Customer (5): Hardik Customer (6). KomalPL /SQL-prosedyren ble fullført
    Samling Metoder

    PL /SQL gir den innebygde samling metoder som gjør samlingene enklere å bruke. Tabellen nedenfor viser de metoder og deres formål:
    S.N.
    Method Name & Formål
    en EXISTS (n)
    Returnerer TRUE hvis n'te element i en samling som finnes; ellers returnerer FALSE.2 COUNT
    Returnerer antall elementer som en samling for tiden contains.3 LIMIT
    Kontrollerer den maksimale størrelsen på en innsamlingstidpunktet.4 FIRST
    Returnerer de første (minste) indeksnumre i en samling som bruker heltall subscripts.5 LAST
    returnerer den siste (største) indeksnumre i en samling som bruker heltall subscripts.6 FØR (n)
    Returnerer indeksnummeret som står foran indeksen n i en collection.7 NEXT (n)
    Returnerer indeksnummeret som lykkes index n.8 < b> EXTEND
    Legger man null element til en collection.9 EXTEND (n)
    Legger n null elementer til en collection.10 EXTEND (n, i)

    Legger n kopier av ed element til en collection.11 TRIM
    Fjerner ett element fra slutten av en collection.12 TRIM (n)

    Fjerner n elementer fra slutten av en collection.13 DELETE
    Fjerner alle elementer fra en samling, sette telle til 0,14 Slett (n)
    Fjerner n'te element fra en assosiativ array med en talltast eller en nestet tabell. Dersom det assosierende matrisen har en streng nøkkel, blir det element som svarer til den nøkkelverdi slettet. Hvis n er null, DELETE (n) gjør nothing.15 DELETE (m, n)
    Fjerner alle elementene i serien m..n fra en assosiativ array eller nestet tabell. Hvis m er større enn n eller hvis m eller n er null, DELETE (m, n) gjør ingenting
    Samling Unntak

    I tabellen nedenfor samlingen unntak, og når de er hevet.
    Samlingen Unntak
    Oppvokst i situasjoner
    COLLECTION_IS_NULLYou prøve å operere på en atomically null collection.NO_DATA_FOUNDA senket angir et element som ble slettet, eller en ikke-eksisterende element i en assosiativ array.SUBSCRIPT_BEYOND_COUNTA senket stiger antall elementer i en collection.SUBSCRIPT_OUTSIDE_LIMITA senket er utenfor det tillatte range.VALUE_ERRORA senket er null eller ikke konverteres til nøkkeltype. Dette unntaket kan oppstå hvis nøkkelen er definert som en PLS_INTEGER rekkevidde, og indeksen er utenfor dette området.