I den här handledningen kommer du att lära dig hur du deklarerar och initierar Oracle PL/SQL-samlingar (kapslade tabeller).
Oracle PL/SQL – Kapslade tabeller
Kapslade tabeller är mycket lika PL/SQL-tabellerna, som i Oracle är kända som index-by
tabeller. Kapslade tabeller utökar funktionaliteten för index-by
tabell genom att lägga till extra insamlingsmetoder (kända som tabellattribut för index-by
tabeller) och genom att lägga till möjligheten att lagra kapslade tabeller i en databastabell, vilket är anledningen till att de kallas kapslade tabeller.
Kapslade tabeller kan också manipuleras direkt med SQL och har ytterligare fördefinierade undantag tillgängliga.
Förutom dessa extra funktioner är den grundläggande funktionaliteten för en kapslad tabell densamma som en PL/SQL-tabell. En kapslad tabell kan ses som en databastabell med två kolumner-nyckel och värde. Som index-tables
, kapslade tabeller kan vara glesa och nycklarna behöver inte vara sekventiella.
Deklarera en kapslad tabell
Syntaxen för att skapa en kapslad tabelltyp är
TYP tabellnamn är TABLE OF table_type [INTE NULL];
där tabellnamn är namnet på den nya typen och table_type
är typen av varje element i den kapslade tabellen. Table_type
kan vara en inbyggd typ, en användardefinierad objekttyp eller ett uttryck som använder %
TYP.
Obs
Den enda syntaktiska skillnaden mellan index-by-tabeller och kapslade tabeller är närvaron av INDEX BY BINARY_INTEGER-satsen. Om denna sats inte finns är typen en kapslad tabelltyp. Om denna klausul finns är typen en indextabelltyp.
Följande deklarativa kodavsnitt visar några giltiga tabelldeklarationer:
DECLARE--Definiera en tabelltyp baserad på en objekttypTYPE t_ClassTab IS TABLE OF Classobj;--En typ baserad på%ROWTYPEType t_StudentsTab IS TABLE Of students%ROWTYPE;--Variabler av ovanstående typerv_ClassList t_ClassList_StudtStabstTist;Oracle PL/SQL - Initiering av kapslade tabeller
När en tabell deklareras som i föregående block, initieras den till att vara atomiskt NULL, som en objekttyp. Om du försöker tilldela en NULL-tabell visas felet "ORA-6531:Referens till oinitierad samling " som motsvarar det fördefinierade undantaget
COLLECTION_IS_NULL
, höjs.Om du fortsätter med föregående exempel kommer följande exekveringsavsnitt att visa detta fel:
BEGIN--Denna uppgift kommer att höja COLLECTION_IS_NULL eftersom--v_ClassList är automatiskt null.v_ClassList(1) :=ClassObj ('HIS', 101, 'History 101', 30, 0, 4, NULL);END;Så hur initierar du en kapslad tabell? Detta kan göras genom att använda konstruktorn. Liksom en objekttypskonstruktor har konstruktorn för en kapslad tabell samma namn som själva tabelltypen. Det tar dock som argument en lista med element, som var och en ska vara typkompatibel med tabellelementtypen.
Följande exempel illustrerar användningen av nsat3eed-tabellkonstruktorn:
DECLARETYPE t_NUMbersTab IS TABLE OF NUMBER;-- Skapa en tabell med ett element.v_Tab1 t_NumbersTab :=t_NumbersTab(-1);-- Skapa en tabell med fem element.v-Primes t_numbersTab :=t_NumbersTab, 2 3 , 5, 7);-- Skapa en tabell utan element.v_Tab2 t_NumbersTab :=t_NumbersTab();BEGIN-- Tilldela till v_Tab1(1). Detta kommer att ersätta värdet ready-- i v_Tab(1), som initierades till -1.v_Tab(1) :=12345;END;Tömma tabeller
Notera deklarationen av
v_Tab2
i föregående block:-- Skapa en tabell utan element.v_Tab2 t_NumbersTab :=t_NumbersTab();
v_Tab2
initieras genom att anropa konstruktorn utan argument. Detta skapar en tabell som inte har några element men inte är atomärt NULL. Följande block illustrerar detta:DECLARETYPE t_WordsTab IS TABLE OF VARCHAR2(50);--Skapa en NULL-tabell.v_Tab1 t_WordsTab;--Skapa en tabell med ett element, som i sig är NULL.v_Tab2 t_WordsTab :=OUT_abTab_Words .PUT_LINE('v_Tab1 är NULL');ELSEDBMS_OUTPUT.PUT_LINE('v_Tab är inte NULL');END IF;IF v_Tab2 ÄR NULL THENDBMS_OUTPUT.PUT_LINE('v_Tab2 är NULL');ELSEDBMS_OUTPUT.PUT_LINE är inte'v_NUT_LINE' );END IF;END;Om vi kör detta block får vi följande utdata:
v_Tab1 är NULLv_Tab2 är inte NULLNycklar vid initiering
När en tabell initieras med hjälp av en konstruktor, numreras tabellens element sekventiellt, från 1 till antalet element som anges i konstruktoranropet. Under senare bearbetning kan värden som lagrats på vissa tangenter raderas (med DELETE-metoden). när en kapslad tabell väljs från databasen, numreras nycklarna om det behövs för att vara sekventiella som de är vid initiering.