sql >> Database teknologi >  >> RDS >> Oracle

Oracle PL/SQL - samlinger (indlejrede tabeller)

I denne øvelse lærer du, hvordan du deklarerer og initialiserer Oracle PL/SQL-samlinger (Nested Tables).

Oracle PL/SQL - Indlejrede tabeller

Indlejrede tabeller minder meget om PL/SQL-tabellerne, som i Oracle er kendt som indeks-by tabeller. Indlejrede tabeller udvider funktionaliteten af ​​indeks-by tabel ved at tilføje ekstra indsamlingsmetoder (kendt som tabelattributter for indeks-efter tabeller) og ved at tilføje muligheden for at gemme indlejrede tabeller i en databasetabel, hvorfor de kaldes indlejrede tabeller.

Indlejrede tabeller kan også manipuleres direkte ved hjælp af SQL og har yderligere foruddefinerede undtagelser tilgængelige.

Ud over disse ekstra funktioner er den grundlæggende funktionalitet i en indlejret tabel den samme som en PL/SQL-tabel. En indlejret tabel kan opfattes som en databasetabel med to kolonner-nøgle og værdi. Ligesom indeks-tabeller , indlejrede tabeller kan være sparsomme, og nøglerne behøver ikke at være sekventielle.

Erklæring af en indlejret tabel

Syntaksen til at oprette en indlejret tabeltype er

TYPE tabelnavn  er TABEL OVER tabeltype  [IKKE NULL];

hvor tabelnavn er navnet på den nye type, og tabeltype er typen af ​​hvert element i den indlejrede tabel. Tabeltype kan være en indbygget type, en brugerdefineret objekttype eller et udtryk, der bruger % TYPE.

Bemærk

Den eneste syntaktiske forskel mellem index-by-tabeller og indlejrede tabeller er tilstedeværelsen af ​​INDEX BY BINARY_INTEGER-udtrykket. Hvis denne klausul ikke er til stede, er typen en indlejret tabeltype. Hvis denne klausul er til stede, er typen en indekstabeltype.

Det følgende deklarative kodeafsnit viser nogle gyldige tabelerklæringer:

DECLARE--Definer en tabeltype baseret på en objekttypeTYPE t_ClassTab IS TABLE OF Classobj;--En type baseret på%ROWTYPEType t_StudentsTab IS TABLE Of students%ROWTYPE;--Variabler af ovenstående typerv_ClassList t_ClassList_StudtStabstent; 

Oracle PL/SQL - Indlejret tabelinitialisering

Når en tabel erklæres som i den foregående blok, initialiseres den til at være atomisk NULL, ligesom en objekttype. Hvis du forsøger at tildele til en NULL-tabel, vises fejlen "ORA-6531:Reference to uninitialized collection " som svarer til den foruddefinerede undtagelse COLLECTION_IS_NULL , er hævet.

Fortsætter det forrige eksempel, vil følgende udførelsessektion vise denne fejl:

BEGIN--Denne opgave vil hæve COLLECTION_IS_NULL fordi--v_ClassList er automatisk null.v_ClassList(1) :=ClassObj ('HIS', 101, 'Historie 101', 30, 0, 4, NULL);END;

Så hvordan initialiserer du en indlejret tabel? Dette kan gøres ved at bruge konstruktøren. Som en objekttypekonstruktør har konstruktøren for en indlejret tabel samme navn som selve tabeltypen. Det tager dog som argument en liste over elementer, som hver skal være typekompatibel med tabelelementtypen.

Følgende eksempel illustrerer brugen af ​​nsat3eed table constructor:

DECLARETYPE t_NUMbersTab ER TABEL MED ANTAL;-- Opret en tabel med ét element.v_Tab1 t_NumbersTab :=t_NumbersTab(-1);-- Opret en tabel med fem elementer.v-Primes t_numbersTab :=t_NumbersTab, 2 3 , 5, 7);-- Lav en tabel uden elementer.v_Tab2 t_NumbersTab :=t_NumbersTab();BEGIN-- Tildel til v_Tab1(1). Dette erstatter værdien ready-- i v_Tab(1), som blev initialiseret til -1.v_Tab(1) :=12345;END;

Tømme tabeller

Bemærk erklæringen om v_Tab2 i den foregående blok:

-- Opret en tabel uden elementer.v_Tab2 t_NumbersTab :=t_NumbersTab();

v_Tab2 initialiseres ved at kalde konstruktøren uden argumenter. Dette skaber en tabel, der ikke har nogen elementer, men som ikke er atomisk NULL. Følgende blok illustrerer dette:

DECLARETYPE t_WordsTab IS TABLE OF VARCHAR2(50);--Opret en NULL-tabel.v_Tab1 t_WordsTab;--Opret en tabel med ét element, som i sig selv er NULL.v_Tab2 t_WordsTab :=t_WordsTab :=tab_UT_BEGYND NULL_Words(1); .PUT_LINE('v_Tab1 er NULL');ELSEDBMS_OUTPUT.PUT_LINE('v_Tab er ikke NULL');END IF;HVIS v_Tab2 ER NULL THENDBMS_OUTPUT.PUT_LINE('v_Tab2 er NULL');ELSEDBMS_OUTPUT.PUT_AB2 er ikke'v_NULL_LINE' );END IF;END;

Hvis vi kører denne blok, får vi følgende output:

v_Tab1 er NULLv_Tab2 er ikke NULL

Nøgler ved initialisering

Når en tabel initialiseres ved hjælp af en konstruktør, nummereres tabellens elementer sekventielt, der spænder fra 1 til det antal elementer, der er angivet i konstruktørkaldet. Under senere behandling kan værdierne, der er gemt på nogle taster, blive slettet (ved brug af SLET-metoden). når en indlejret tabel er valgt fra databasen, omnummereres nøglerne om nødvendigt for at være sekventielle, som de er ved initialisering.

  1. Årsager til MySQL-fejl 2014 Kan ikke udføre forespørgsler, mens andre ubuffrede forespørgsler er aktive

  2. Opret tabel i procedure

  3. Hvordan finder man den medarbejder med den næsthøjeste løn?

  4. VALUES-erklæring i MySQL