Опубликован: 05.01.2004 | Уровень: специалист | Доступ: свободно | ВУЗ: Московский государственный университет имени М.В.Ломоносова
Лекция 12:

Коллекции и записи

< Лекция 11 || Лекция 12: 123 || Лекция 13 >
Аннотация: В лекции обсуждаются вопросы создания и применения коллекций в языке PL/SQL.

Коллекции

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