В начало

 

 

5.3 Динамическое объявление типа переменных

Во многих случаях для работы с данными, хранимыми в таблицах базы данных, используются переменные PL/SQL. При этом переменной, работающей с некоторым столбцом, следует присваивать тип, соответствующий типу столбца. Например, столбец fam таблицы student имеет тип VARCHAR2(20). С учетом этого можно объявить переменную следующим образом:

DECLARE

v_fam VARCHAR2(20);

Посмотрим, что произойдет, если описание столбца fam изменится. Предположим, что таблица модифицирована и столбец fam имеет теперь тип VARCHAR2(25). Текст программы PL/SQL, в которой используется этот столбец, должен быть изменен:

DECLARE

v_fam VARCHAR2(25);

Если программа PL/SQL велика, этот процесс может занять много времени, и, кроме того, существует большая вероятность внесения ошибки. В этом случае вместо жесткого задания типа переменной можно воспользоваться атрибутом %TYPE. Он добавляется к ссылке на столбец таблицы или к другой переменной и возвращает ее тип. Например:

DECLARE

v_fam student.fam%TYPE;

При использовании %TYPE переменная v_fam будет иметь тот тип, который присвоен столбцу fam таблицы student. Тип определяется всякий раз, когда данный блок выполняется для анонимных и именованных блоков и когда компилируются хранимые объекты (процедуры, функции и т.д.). %TYPE может быть также использован с переменными PL/SQL, объявленными ранее.

Пример:

DECLARE

v_Room classes.room%TYPE; -- NUMBER (5)

v_Room2 v_Room%TYPE; -- NUMBER (5)

v_Temp NUMBER(7,3) NOT NULL := 12.3;

v_Temp2 v_Temp%TYPE; -- NUMBER (7,3)

Если атрибут %TYPE применяется для переменной (столбца), которая (который) содержит ограничение NOT NULL (например, classes. room и v_Temp), то возвращаемый тип не имеет этого ограничения. Приведенный выше блок вполне корректен, хотя переменные v_Room, v_Room2 и v_Temp2 не инициализированы. Дело в том, что эти переменные могут содержать NULL-значения.

Для объявления записи PL/SQL применяются типы данных, соответствующие строке таблицы базы данных. Для этих целей PL/SQL предоставляет оператор %ROWTYPE. Аналогично %TYPE, %ROWTYPE возвращает тип данных на основе определения таблицы. Например, такое объявление, как

DECLARE

v_RoomRecord rooms%ROWTYPE;

определяет запись, поля которой соответствуют столбцам таблицы rooms. В частности, v_RoomRecord будет выглядеть следующим образом:

(room_id NUMBER(5),

building VARCHAR2(15),

room_number NUMBER(4),

description VARCHAR2(50))

Как и в случае %TYPE, сюда не включается ограничение NOT NULL, определенное для столбца. Однако длина столбцов VARCHAR2 и CHAR, a также точность и масштаб для столбцов NUMBER учитываются.

Если определение таблицы изменяется, то %ROWTYPE изменяется вместе с ним. Подобно %TYPE, %ROWTYPE определяется всякий раз, когда анонимный блок передается среде выполнения PL/SQL, и всякий раз, когда компилируется хранимый объект.