Коллекции и записи
Коллекции
Коллекцией называется упорядоченная группа элементов одного типа. Язык PL/SQL поддерживает три вида коллекций:
- вложенные таблицы (nested tables) ;
- индексированные таблицы ;
- varray-массивы (variable-size arrays).
Доступ к любому элементу вложенной таблицы или varray-массива осуществляется по его индексу, который указывается в скобках после имени переменной типа коллекции. Коллекция может быть передана в качестве параметра. Коллекцию можно использовать:
- для обмена с таблицами баз данных и столбцами данных;
- для передачи столбца данных из приложения клиента в хранимую процедуру или обратно.
Для создания коллекции следует определить тип коллекции - TABLE или VARRAY - и объявить переменную этого типа. Определение типа выполняется в секции объявлений блока PL/SQL, подпрограммы или пакета.
Вложенные таблицы
Определение типа вложенной таблицы может иметь следующее формальное описание:
TYPE type_name IS TABLE OF element_type [NOT NULL];
Параметр type_name указывает имя определяемого типа, а element_type - это любой допустимый тип данных PL/SQL, исключая некоторые типы, в том числе VARRAY, TABLE, BOOLEAN, LONG, REF CURSOR и т.п.
Вложенную таблицу можно рассматривать как одномерный массив, в котором индексами служат значения целочисленного типа в диапазоне от 1 до 2147483647 . Вложенная таблица может иметь пустые элементы, которые появляются после их удаления встроенной процедурой DELETE. Вложенная таблица может динамически увеличиваться.
Индексированные таблицы
Индексированные таблицы позволяют работать со столбцами как с единой переменной - массивом.
Определение индексированной таблицы (index-by tables ) может иметь следующее формальное описание:
TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY BINARY_INTEGER;
Индексированная таблица - это вариант вложенной таблицы, в которой элементы могут иметь произвольные целочисленные значения индексов. Такой тип данных очень удобен, если в качестве индекса использовать значение первичного ключа.
VARRAY-массивы
Определение типа Varray-массива может иметь следующее формальное описание:
TYPE type_name IS {VARRAY | VARYING ARRAY} (size_limit) OF element_type [NOT NULL];
Параметр type_name указывает имя определяемого типа, size_limit - максимальное количество элементов, а element_type - это любой допустимый тип данных PL/SQL, исключая некоторые типы, такие как VARRAY, TABLE, BOOLEAN, LONG, REF CURSOR и т.п.
Если типом элемента является тип "запись", то каждое поле записи должно быть скалярного или объектного типа.
Максимальное количество элементов в Varray-массиве указывается при определении типа и не может изменяться динамически. Доступ к каждому элементу Varray-массива осуществляется по индексу. Varray-массивы можно передавать в качестве параметров. Varray-массивы не могут иметь пустот, так как для них нет операции удаления произвольного элемента массива.
Например:
DECLARE TYPE d1 IS VARRAY(365) OF DATE; TYPE rec1 IS RECORD (v1 VARCHAR2(10), v2 VARCHAR2(10)); - Массив записей TYPE arr_rec IS VARRAY(250) OF rec1; - Вложенная таблица TYPE F1T1 IS TABLE OF tbl1.f1%TYPE; CURSOR c1 IS SELECT * FROM tbl1; - Массив записей, - основанный на курсоре TYPE t1 IS VARRAY(50) OF c1%ROWTYPE; TYPE t2 IS TABLE OF tbl1%ROWTYPE - Индексированная таблица INDEX BY BINARY_INTEGER; - Объявление переменной rec_t2 t2; BEGIN /* Использование переменной типа "индексированная таблица" */ SELECT * INTO rec_t2(120) FROM tbl1 WHERE f1 = 120; END;
Инициализация коллекций
Для инициализации коллекции используется конструктор - автоматически создаваемая функция, одноименная с типом коллекции.
Конструктор создает коллекцию из значений переданного ему списка параметров. Конструктор может быть вызван как в секции объявлений через знак присваивания после указания типа, так и в теле программы. Вызов конструктора без параметров означает инициализацию коллекции как пустой, но не устанавливает ее равной NULL.
Например:
DECLARE CREATE TYPE rec_var1 AS VARRAY(3) OF num; CREATE TYPE rec_var2 AS VARRAY(3) OF rec_obj; r1 rec_var1; r2 rec_var2; BEGIN /* Инициализация коллекции из трех элементов */ r1 := rec_var1 (2.0, 2.1, 2.2); /*Инициализация varray-массива, содержащего объекты типа rec_obj */ r2 := rec_var2 (rec_obj(1, 100, 'fff'), rec_obj (2,110, 'ggg'), rec_obj (3,120, 'jjj'));
Оператор CREATE TYPE позволяет сохранить определяемый тип в базе данных.
Конструктор можно вызывать в любом месте, где допустим вызов функции. Для того чтобы добавить в таблицу базы данных строку, одно из полей которой имеет тип коллекции, следует использовать конструктор.
Например:
BEGIN INSERT INTO tbl_coll VALUES (1, 'aaa', rec_obj (3,120, 'jjj'));