Объявление записей в PL/SQL Oracle
В PL/SQL существует три способа объявления записей:
Запись на основе таблицы
Для объявления записи, каждое поле которой соответствует значению одноименного столбца таблицы, используется атрибут %ROWTYPE с именем таблицы. Пример объявления записи one_book, которая имеет ту же структуру, что и таблица books:
-- Таблица books CREATE TABLE books ( book_id INTEGER, isbn VARCHAR2(13), title VARCHAR2(200), summary VARCHAR2(2000), author VARCHAR2(200), date_published DATE, page_count NUMBER ); -- объявление записи DECLARE one_book books%ROWTYPE;
Запись на основе курсора
Для объявления записи на основе явно заданного курсора или курсора, представленного переменной, где каждое поле соответствует столбцу или именованному выражению в команде SELECT, предназначен атрибут %ROWTYPE.
Вот пример объявления записи, которая имеет ту же структуру, что и явный курсор:
DECLARE CURSOR my_books_cur IS SELECT * FROM books WHERE author LIKE '%FEUERSTEIN%'; one_SF_book my_books_cur%ROWTYPE;
Запись, определяемая разработчиком
Чтобы создать запись с нуля, то есть явно определить каждое поле, задавая его имя и тип данных, следует воспользоваться командой TYPE…RECORD. Значением поля записи, определяемой разработчиком, может быть не только скалярное значение, но и другая запись. В следующем примере определяется тип записи, содержащей информацию о писательской карьере автора книги, и объявляется экземпляр записи этого типа:
DECLARE TYPE book_info_rt IS RECORD ( author books.author%TYPE, category VARCHAR2(100), total_page_count POSITIVE); steven_as_author book_info_rt;
Обратите внимание: в объявлении записи пользовательского типа атрибут %ROWTYPE не указывается. Запись в данном случае имеет тип book_info_rt.
Общий формат объявления атрибута %ROWTYPE таков:
имя_записи [имя_схемы.]имя_объекта%ROWTYPE [ DEFAULT|:= совместимая_запись ];
Указывать параметр имя_схемы не обязательно (если он не задан, то для разрешения ссылки используется схема, внутри которой компилируется данный код). В качестве параметра имя_объекта может использоваться явный курсор, курсорная переменная, таблица, представление или синоним. Также при объявлении можно указать необязательное значение по умолчанию, которое должно быть записью того же или совместимого типа.
Пример создания записи на основе курсорной переменной:
DECLARE TYPE book_rc IS REF CURSOR RETURN books%ROWTYPE; book_cv book_rc; one_book book_cv%ROWTYPE; BEGIN
Запись также можно объявить и неявно — например, в цикле FOR с курсором. В следующем блоке кода раздел объявлений не содержит определения записи book_rec. PL/SQL автоматически объявляет запись с атрибутом %ROWTYPE:
BEGIN FOR book_rec IN (SELECT * FROM books) LOOP calculate_total_sales (book_rec); END LOOP; END;