sql >> Database >  >> RDS >> Oracle

Oracle PL/SQL - Verzamelingen (geneste tabellen)

In deze zelfstudie leert u hoe u Oracle PL/SQL-verzamelingen (geneste tabellen) declareert en initialiseert.

Oracle PL/SQL - Geneste tabellen

Geneste tabellen lijken erg op de PL/SQL-tabellen, die in Oracle bekend staan ​​als index-by tafels. Geneste tabellen breiden de functionaliteit van index-by uit tabel door extra verzamelmethoden toe te voegen (bekend als tabelattributen voor index-by tabellen) en door de mogelijkheid toe te voegen om geneste tabellen op te slaan in een databasetabel, daarom worden ze geneste tabellen genoemd.

Geneste tabellen kunnen ook rechtstreeks worden gemanipuleerd met behulp van SQL en er zijn aanvullende vooraf gedefinieerde uitzonderingen beschikbaar.

Afgezien van deze extra functies, is de basisfunctionaliteit van een geneste tabel hetzelfde als die van een PL/SQL-tabel. Een geneste tabel kan worden beschouwd als een databasetabel met twee kolommen:sleutel en waarde. Zoals index-tables , geneste tabellen kunnen schaars zijn en de toetsen hoeven niet opeenvolgend te zijn.

Een geneste tabel declareren

De syntaxis voor het maken van een genest tabeltype is

TYPE tabelnaam  is TABLE OF table_type  [NIET NULL];

waarbij table_name de naam is van het nieuwe type, en table_type is het type van elk element in de geneste tabel. Table_type kan een ingebouwd type zijn, een door de gebruiker gedefinieerd objecttype of een uitdrukking met behulp van % TYPE.

Opmerking

Het enige syntactische verschil tussen index-by-tabellen en geneste tabellen is de aanwezigheid van de INDEX BY BINARY_INTEGER-clausule. Als deze clausule niet aanwezig is, is het type een genest tabeltype. Als deze clausule aanwezig is, dan is het type een indextabeltype.

Het volgende declaratieve gedeelte van de code toont enkele geldige tabeldeclaraties:

DECLARE--Definieer een tabeltype op basis van een objecttypeTYPE t_ClassTab IS TABLE OF Classobj;--Een type gebaseerd op%ROWTYPEType t_StudentsTab IS TABLE Of students%ROWTYPE;--Variabelen van de bovenstaande typenv_ClassList t_ClassesTab;v_StudentListTab_StudentList t_StudentList t_StudentList t_StudentsTab; /pre> 

Oracle PL/SQL - Initialisatie van geneste tabel

Wanneer een tabel wordt gedeclareerd zoals in het voorgaande blok, wordt deze geïnitialiseerd om atomair NULL te zijn, zoals een objecttype. Als u probeert toe te wijzen aan een NULL-tabel, wordt de fout "ORA-6531:verwijzing naar niet-geïnitialiseerde verzameling " wat overeenkomt met de vooraf gedefinieerde uitzondering COLLECTION_IS_NULL , is verhoogd.

Voortzetting van het vorige voorbeeld, de volgende uitvoeringssectie zal deze fout veroorzaken:

BEGIN--Deze toewijzing verhoogt COLLECTION_IS_NULL omdat--v_ClassList automatisch null is.v_ClassList(1) :=ClassObj ('HIS', 101, 'History 101', 30, 0, 4, NULL);END;

Dus hoe initialiseer je een geneste tabel? Dit kan met behulp van de constructor. Net als een objecttypeconstructor heeft de constructor voor een geneste tabel dezelfde naam als het tabeltype zelf. Het heeft echter als argument een lijst met elementen nodig, die elk type compatibel moeten zijn met het type tabelelement.

Het volgende voorbeeld illustreert het gebruik van de nsat3eed-tabelconstructor:

DECLARETYPE t_NUmbersTab IS TABLE OF NUMBER;-- Maak een tabel met één element.v_Tab1 t_NumbersTab :=t_NumbersTab(-1);-- Maak een tabel met vijf elementen.v-Primes t_numbersTab :=t_NumbersTab(1, 2, 3 , 5, 7);-- Maak een tabel zonder elementen.v_Tab2 t_NumbersTab :=t_NumbersTab();BEGIN-- Wijs toe aan v_Tab1(1). Dit vervangt de waarde ready-- in v_Tab(1), die is geïnitialiseerd naar -1.v_Tab(1) :=12345;END;

Tafels leegmaken

Let op de verklaring van v_Tab2 in het voorgaande blok:

-- Maak een tabel zonder elementen.v_Tab2 t_NumbersTab :=t_NumbersTab();

v_Tab2 wordt geïnitialiseerd door de constructor zonder argumenten aan te roepen. Dit creëert een tabel die geen elementen heeft, maar niet atomair NULL is. Het volgende blok illustreert dit:

DECLARETYPE t_WordsTab IS TABLE OF VARCHAR2(50);--Creëer een NULL-tabel.v_Tab1 t_WordsTab;--Maak een tabel met één element, dat zelf NULL is.v_Tab2 t_WordsTab :=t_WordsTabULL_NDBEGINBEGINIISIFULL_NDBEGINBEGINI .PUT_LINE('v_Tab1 is NULL');ELSEDBMS_OUTPUT.PUT_LINE('v_Tab is niet NULL');END IF;IF v_Tab2 IS NULL THENDBMS_OUTPUT.PUT_LINE('v_Tab2 is NULL');ELSEDBMS_OUTPUT.PULL_UT_LINE('v_Tab2 is not NULL'); );END IF;END;

Als we dit blok uitvoeren, krijgen we de volgende uitvoer:

v_Tab1 is NULLv_Tab2 is niet NULL

Toetsen bij initialisatie

Wanneer een tabel wordt geïnitialiseerd met behulp van een constructor, worden de elementen van de tabel opeenvolgend genummerd, variërend van 1 tot het aantal elementen dat is opgegeven in de constructoraanroep. Tijdens latere verwerking kunnen de waarden die op sommige toetsen zijn opgeslagen, worden verwijderd (met behulp van de DELETE-methode). wanneer een geneste tabel uit de database wordt geselecteerd, worden de sleutels indien nodig opnieuw genummerd om opeenvolgend te zijn zoals ze zijn bij initialisatie.

  1. Hoe make_interval() werkt in PostgreSQL

  2. php-bestandsupload, hoe het bestandsuploadtype te beperken

  3. Resultaten beperken in T-SQL

  4. 7 manieren om uw Oracle-versie te controleren