W tym samouczku dowiesz się, jak deklarować i inicjować kolekcje Oracle PL/SQL (zagnieżdżone tabele).
Oracle PL/SQL - Tabele zagnieżdżone
Tabele zagnieżdżone są bardzo podobne do tabel PL/SQL, które w Oracle są znane jako index-by
tabele. Tabele zagnieżdżone rozszerzają funkcjonalność index-by
tabeli przez dodanie dodatkowych metod zbierania (znanych jako atrybuty tabeli dla index-by
tabel) oraz przez dodanie możliwości przechowywania zagnieżdżonych tabel w tabeli bazy danych, dlatego nazywa się je zagnieżdżonymi tabelami.
Zagnieżdżone tabele można również manipulować bezpośrednio za pomocą SQL i mają dostępne dodatkowe predefiniowane wyjątki.
Poza tymi dodatkowymi funkcjami, podstawowa funkcjonalność tabeli zagnieżdżonej jest taka sama jak tabeli PL/SQL. Zagnieżdżoną tabelę można traktować tak samo, jak tabelę bazy danych z dwoma kolumnami - kluczem i wartością. Podobnie jak index-tables
, zagnieżdżone tabele mogą być rzadkie, a klucze nie muszą być sekwencyjne.
Deklarowanie tabeli zagnieżdżonej
Składnia tworzenia typu tabeli zagnieżdżonej to
TYP nazwa_tabeli to TABLE OF table_type [NIE NULL];
gdzie nazwa_tabeli jest nazwą nowego typu, a table_type
to typ każdego elementu w zagnieżdżonej tabeli. Table_type
może być typem wbudowanym, typem obiektu zdefiniowanym przez użytkownika lub wyrażeniem używającym %
TYP.
Uwaga
Jedyną różnicą składniową między tabelami indeksowanymi a tabelami zagnieżdżonymi jest obecność klauzuli INDEX BY BINARY_INTEGER. Jeśli ta klauzula nie występuje, typ jest typem tabeli zagnieżdżonej. Jeśli ta klauzula jest obecna, to typ jest typem tabeli indeksowej.
Poniższa deklaratywna sekcja kodu zawiera kilka poprawnych deklaracji tabeli:
DECLARE--Zdefiniuj typ tabeli na podstawie obiektu typeTYPE t_ClassTab IS TABLE OF Classobj;--Typ oparty na %ROWTYPEType t_StudentsTab IS TABLE Of Students%ROWTYPE;--Zmienne powyższych typówv_ClassList t_ClassesTab;v_StudentList t_StudentsTab;Oracle PL/SQL — inicjalizacja tabeli zagnieżdżonej
Gdy tabela jest zadeklarowana tak, jak w poprzednim bloku, jest inicjowana jako atomowa wartość NULL, podobnie jak typ obiektu. Jeśli spróbujesz przypisać do tabeli NULL, błąd „ORA-6531:odwołanie do niezainicjowanej kolekcji ", który odpowiada wstępnie zdefiniowanemu wyjątkowi
COLLECTION_IS_NULL
, jest podniesiony.Kontynuując poprzedni przykład, następująca sekcja dotycząca wykonania spowoduje wyświetlenie tego błędu:
BEGIN--To przypisanie wywoła COLLECTION_IS_NULL, ponieważ--v_ClassList jest automatycznie null.v_ClassList(1) :=ClassObj ('HIS', 101, 'History 101', 30, 0, 4, NULL);END;Jak więc zainicjować zagnieżdżoną tabelę? Można to zrobić za pomocą konstruktora. Podobnie jak konstruktor typu obiektu, konstruktor tabeli zagnieżdżonej ma taką samą nazwę jak sam typ tabeli. Jednak jako argument przyjmuje listę elementów, z których każdy powinien być zgodny z typem elementu tabeli.
Poniższy przykład ilustruje użycie konstruktora tabeli nsat3eed:
DECLARETYPE t_NumbersTab JEST TABELĄ NUMERÓW;-- Utwórz tabelę z jednym elementem.v_Tab1 t_NumbersTab :=t_NumbersTab(-1);-- Utwórz tabelę z pięcioma elementami.v-Primes t_numbersTab :=t_NumbersTab(1, 2, 3 , 5, 7);-- Utwórz tabelę bez elementów.v_Tab2 t_NumbersTab :=t_NumbersTab();BEGIN-- Przypisz do v_Tab1(1). Zastąpi to wartość ready-- w v_Tab(1), która została zainicjowana do -1.v_Tab(1) :=12345;END;Puste tabele
Zwróć uwagę na deklarację
v_Tab2
w poprzednim bloku:-- Utwórz tabelę bez elementów.v_Tab2 t_NumbersTab :=t_NumbersTab();
v_Tab2
jest inicjowany przez wywołanie konstruktora bez argumentów. Tworzy to tabelę, która nie zawiera elementów, ale nie ma atomowej wartości NULL. Poniższy blok ilustruje to:DECLARETYPE t_WordsTab JEST TABELĄ VARCHAR2(50);--Utwórz tabelę NULL.v_Tab1 t_WordsTab;--Utwórz tabelę z jednym elementem, który sam ma wartość NULL.v_Tab2 t_WordsTab :=t_WordsTabTab1; .PUT_LINE('v_Tab1 ma wartość NULL');ELSEDBMS_OUTPUT.PUT_LINE('v_Tab nie ma wartości NULL');END IF;IF v_Tab2 JEST NULL THENDBMS_OUTPUT.PUT_LINE('v_Tab2 ma wartość NULL');ELSEDBMS_OUTPUT.PUT_LINE nie ma wartości NULL_PUT_LINE(') );END IF;END;Jeśli uruchomimy ten blok, otrzymamy następujące wyjście:
v_Tab1 jest NULLv_Tab2 nie jest NULLKlawisze podczas inicjalizacji
Gdy tabela jest inicjowana przy użyciu konstruktora, elementy tabeli są numerowane sekwencyjnie, od 1 do liczby elementów określonej w wywołaniu konstruktora. Podczas późniejszego przetwarzania wartości zapisane w niektórych kluczach mogą zostać usunięte (przy użyciu metody DELETE). gdy zagnieżdżona tabela jest wybierana z bazy danych, klucze są przenumerowane, jeśli to konieczne, aby były sekwencyjne, tak jak podczas inicjalizacji.