Коллекции и записи
Коллекции
Коллекцией называется упорядоченная группа элементов одного типа. Язык 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'));