В этом учебном материале вы узнаете, как использовать атрибут %ROWTYPE в Oracle PL/SQL с синтаксисом и примерами.
Описание
В Oracle PL/SQL атрибут %ROWTYPE предоставляет тип записи, представляющий строку в таблице (или представлении) базы данных Oracle. Запись может хранить целую строку данных, выбранных из таблицы, или извлекаться из курсора или строго типизированной переменной курсора.
Синтаксис
Синтаксис объявления переменной с атрибутом %ROWTYPE в Oracle PL/SQL:
Параметры или аргументы
v_rec - имя переменной которой присваивается значение записи
table_name – имя таблицы базы данных
Примечание
- Столбцы в строке и соответствующие поля в записи имеют одинаковые имена и типы данных.
- Поля в записи %ROWTYPE не наследуют ограничение столбца NOT NULL.
Пример
Рассмотрим пример Oracle, чтобы понять, как применять %ROWTYPE в Oracle PL/SQL.
Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
DECLARE -- %ROWTYPE может включать все столбцы в таблице ... emp_rec employees%ROWTYPE; -- ... или подмножество столбцов на основе курсора. CURSOR c1 IS SELECT department_id, department_name FROM departments; dept_rec c1%ROWTYPE; -- Можно даже создать %ROWTYPE со столбцами из нескольких таблиц. CURSOR c2 IS SELECT employee_id, email, employees.manager_id, location_id FROM employees, departments WHERE employees.department_id = departments.department_id; join_rec c2%ROWTYPE; BEGIN -- Мы знаем, что EMP_REC может содержать строку из таблицы EMPLOYEES. SELECT * INTO emp_rec FROM employees WHERE ROWNUM < 2; -- Мы можем ссылаться на поля EMP_REC, используя имена столбцов -- из таблицы EMPLOYEES. IF emp_rec.department_id = 20 AND emp_rec.last_name = 'JOHNSON' THEN emp_rec.salary := emp_rec.salary * 1.15; END IF; END; |
В этом примере Oracle PL/SQL мы объявили переменную emp_rec основанную на записи таблицы employees. Также мы объявили переменную join_rec основанную на записи курсора c2 созданного из полей таблиц employees и departments.
Пример с совокупным присвоением
Рассмотри пример, который показывает, как присвоить значения всем полям в одной записи одновременно. Вы можете присвоить одну запись другой, если их объявления относятся к одной и той же таблице или курсору. Например, разрешено следующее присвоение:
1 2 3 4 5 6 7 8 9 10 |
DECLARE dept_rec1 departments%ROWTYPE; dept_rec2 departments%ROWTYPE; CURSOR c1 IS SELECT department_id, location_id FROM departments; dept_rec3 c1%ROWTYPE; BEGIN dept_rec1 := dept_rec2; -- допустимо -- dept_rec2 относится к таблице, dept_rec3 относится к курсору -- dept_rec2 := dept_rec3; -- недопустимо END; |
В этом примере Oracle PL/SQL мы объявили переменные dept_rec1, dept_rec2 основанные на записи таблицы departments. Также мы объявили курсор c1 содержащий поля department_id, location_id таблицы departments. Т.к. таблица departments представлена в базе данных полями department_id, department_name, manager_id, location_id, то присвоение dept_rec2 := dept_rec3 недопустимо.
Следующий пример показывает, как присвоить список значений столбцов записи с помощью инструкции SELECT.
1 2 3 4 5 6 |
DECLARE dept_rec departments%ROWTYPE; BEGIN SELECT * INTO dept_rec FROM departments WHERE department_id = 30 and ROWNUM < 2; END; |
В этом примере переменной dept_rec присваивается значение записи из таблицы departments со значением department_id равным 30.