Oracle
 sql >> база данни >  >> RDS >> Oracle

Oracle PL/SQL – Колекции (вложени таблици)

В този урок ще научите как да декларирате и инициализирате 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_Classes 

Oracle 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). когато от базата данни е избрана вложена таблица, ключовете се преномерират, ако е необходимо, за да бъдат последователни, както са при инициализацията.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-12505, TNS:слушателят в момента не знае за SID, даден в дескриптора на свързване

  2. Oracle 18c Нова функция:Онлайн модификация на разделянето

  3. Параметризирана заявка в проблем с Oracle

  4. SYS_GUID() Функция в Oracle

  5. Как да проверя NLS_LANG на клиента?