В този урок ще научите как да декларирате и инициализирате Oracle PL/SQL колекции (вложени таблици).
Oracle PL/SQL – Вложени таблици
Вложените таблици са много подобни на PL/SQL таблиците, които са известни в Oracle като index-by
маси. Вложените таблици разширяват функционалността на index-by
таблица чрез добавяне на допълнителни методи за събиране (известни като атрибути на таблица за index-by
таблици) и чрез добавяне на възможност за съхраняване на вложени таблици в таблица на база данни, поради което те се наричат вложени таблици.
Вложените таблици също могат да се манипулират директно с помощта на SQL и имат налични допълнителни предварително дефинирани изключения.
Освен тези допълнителни функции, основната функционалност на вложената таблица е същата като таблицата PL/SQL. Вложената таблица може да се разглежда като таблица на база данни с две колони - ключ и стойност. Като index-tables
, вложените таблици могат да бъдат редки и ключовете не трябва да са последователни.
Деклариране на вложена таблица
Синтаксисът за създаване на тип вложена таблица е
TYPE име_на_таблица е TABLE OF table_type [NOT NULL];
където table_name е името на новия тип и table_type
е типът на всеки елемент във вложената таблица. Table_type
може да бъде вграден тип, дефиниран от потребителя тип обект или израз, използващ %
ТИП.
Забележка
Единствената синтактична разлика между индекс по таблици и вложени таблици е наличието на клаузата INDEX BY BINARY_INTEGER. Ако тази клауза не е налице, тогава типът е тип вложена таблица. Ако тази клауза е налице, тогава типът е тип индексна таблица.
Следният декларативен раздел на кода показва някои валидни декларации на таблица:
DECLARE--Дефинирайте тип таблица въз основа на обект typeTYPE t_ClassTab IS TABLE OF Classobj;--Тип, базиран на%ROWTYPEType t_StudentsTab IS TABLE Of students%ROWTYPE;--Променливи от горните типовеv_ClassStudentListTabTab_ClassesOracle PL/SQL – Инициализация на вложена таблица
Когато дадена таблица е декларирана както в предходния блок, тя се инициализира да бъде атомарно NULL, като тип обект. Ако се опитате да присвоите на таблица NULL, грешката „ORA-6531:Препратка към неинициализирана колекция ", което съответства на предварително дефинираното изключение
COLLECTION_IS_NULL
, се повишава.Продължавайки предишния пример, следната секция за изпълнение ще предизвика тази грешка:
BEGIN--Това присвояване ще повиши COLLECTION_IS_NULL, защото--v_ClassList автоматично е null.v_ClassList(1) :=ClassObj ('HIS', 101, 'History 101', 30, 0, 4, NULL);END;предварително>И така, как да инициализирате вложена таблица? Това може да стане с помощта на конструктора. Подобно на конструктор на тип обект, конструкторът за вложена таблица има същото име като самия тип таблица. Въпреки това, той приема като аргумент списък с елементи, всеки от които трябва да е съвместим по тип с типа елемент на таблицата.
Следният пример илюстрира използването на конструктор на таблица nsat3eed:
DECLARETYPE t_NUmbersTab IS TABLE OF NUMBER;-- Създайте таблица с един елемент.v_Tab1 t_NumbersTab :=t_NumbersTab(-1);-- Създайте таблица с пет елемента.v-Primes t_numbersTab :=Tab(1, 2) 3 , 5, 7);-- Създайте таблица без elemnts.v_Tab2 t_NumbersTab :=t_NumbersTab();BEGIN-- Присвояване на v_Tab1(1). Това ще замени стойността ready-- във v_Tab(1), която беше инициализирана до -1.v_Tab(1) :=12345;END;Празни таблици
Обърнете внимание на декларацията на
v_Tab2
в предходния блок:-- Създайте таблица без елементи.v_Tab2 t_NumbersTab :=t_NumbersTab();
v_Tab2
се инициализира чрез извикване на конструктора без аргументи. Това създава таблица, която няма елементи, но не е атомарно NULL. Следният блок илюстрира това:DECLARETYPE t_WordsTab Е ТАБЛИЦА НА VARCHAR2(50);--Създайте таблица NULL.v_Tab1 t_WordsTab;--Създайте таблица с един елемент, който сам по себе си е NULL.v_Tab2 t_WordsTab :ENDBIS t_WordsTab :ENDBIS TabOUT_Wor .PUT_LINE('v_Tab1 е NULL');ELSEDBMS_OUTPUT.PUT_LINE('v_Tab не е NULL');END IF;АКО v_Tab2 Е NULL THENDBMS_OUTPUT.PUT_LINE('v_Tab2 е NULL');ELSEDBMS_OUTPUT.PUT_LINE('v_Tab не е NULL');END IF;АКО v_Tab2 Е NULL THENDBMS_OUTPUT.PUT_LINE('v_Tab2 е NULL');ELSEDBTTab_OUTPUT('.vNULLLINE не е NULL). );КРАЙ АКО;КРАЙ;Ако стартираме този блок, получаваме следния изход:
v_Tab1 е NULLv_Tab2 не е NULLКлючове при инициализация
Когато таблица се инициализира с помощта на конструктор, елементите на таблицата се номерират последователно, вариращи от 1 до броя елементи, посочени в извикването на конструктора. При по-късна обработка стойностите, съхранени в някои ключове, могат да бъдат изтрити (използвайки метода DELETE). когато от базата данни е избрана вложена таблица, ключовете се преномерират, ако е необходимо, за да бъдат последователни, както са при инициализацията.