Коллекции и записи
Записи
Записью называется набор элементов, хранимых в полях записи . Каждое поле имеет свое имя и тип.
Записи нельзя сравнивать на равенство или неравенство и на эквивалентность значению NULL.
Запись может быть объявлена на базе существующей структуры таблицы или как новый тип.
Для объявления записи, имеющей структуру, соответствующую строке таблицы базы данных, используется атрибут %ROWTYPE.
Объявление нового типа "запись" может иметь следующее формальное описание:
TYPE type_name IS RECORD (field_declaration [, field_declaration]...);
Описание поля ( field_declaration ) указывается как:
field_name field_type [[NOT NULL] {:= | DEFAULT} expression]
Параметр type_name задает имя определяемого типа; field_type указывает тип поля как любой тип PL/SQL за исключением REF CURSOR ; expression определяет значение инициализации.
Как и для коллекций, для создания записи следует сначала определить тип RECORD, а затем объявить запись данного типа.
Тип "запись" существует только на время выполнения программы и не может быть сохранен в базе данных в отличие от типов TABLE и VARRAY.
Для доступа к любому полю записи используется следующая нотация: record_name.field_name. Если field_name также является записью, то для доступа к его вложенному полю используется та же нотация: record_name.field_name.field1_name и т.д.
В выражениях языка PL/SQL выполнять присваивание значения можно как отдельно полю, так и всей записи.
Выполнять присвоение значения всей записи можно двумя способами:
- использовать в качестве присваиваемого значения запись того же типа;
- задать запись в качестве INTO -переменной в SQL-операторе SELECT или FETCH.
Например:
DECLARE - Определение типа TYPE T_rec IS RECORD ( f1 tbl1.f1%TYPE, f2 VARCHAR2(15), f3 REAL(7,2)); - Тип на основе строки таблицы rec3 tbl1%ROWTYPE; - Объявление записи rec1 T_rec; f_sum1 REAL; FUNCTION sum_f3 (n INTEGER) RETURN T_rec IS rec2 T_rec; BEGIN - : - Функция возвращает значение - типа запись RETURN rec2; END; BEGIN - Вызов функции rec1 := sum_f3(4); f_sum1 := sum_f3(4).f3; SELECT * INTO rec3 FROM tbl1 WHERE f1 = 1; END;