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