При обращении к переменной или константе, необходимо ее объявить (единственным исключением из этого правила являются индексные переменные циклов FOR.) Все объявления должны быть сделаны в разделе объявлений анонимного блока, процедуры, функции, триггера, тела пакета или тела объектного типа. В PL/SQL вы можете объявить множество типов данных и структур данных, включая переменные, константы, пользовательские типы TYPE (например, для коллекции или записи) и исключения.
Объявление переменных PL/SQL
При объявлении переменной PL/SQL выделяет память для значения переменной и присваивает этому хранилищу имя, используя которое вы сможете извлекать и изменять данное значение. В объявлении также указывается тип данных переменной, который будет использован для проверки корректности значений, присваиваемых переменной.
Для объявления используется следующая синтаксическая конструкция:
имя тип_данных [NOT NULL] [значение_по_умолчанию];
где имя - это имя объявляемой переменной или константы, а тип_данных - это тип или подтип значений, которые могут присваиваться этой переменной. Включение в объявление выражения NOT NULL означает, что если в коде будет предпринята попытка присвоения вашей переменной значения NULL, то Oracle инициирует исключение. Выражение [значение по умолчанию] позволяет инициализировать переменную; оно необязательно для всех объявлений, кроме объявлений констант.
Рассмотрим пример объявления переменных различных типов данных:
DECLARE
-- Простое объявление числовой переменной
l_total_count NUMBER;
-- Объявление числа, округляемого до сотых (центов):
l_dollar_amount NUMBER (10,2);
-- Отдельная переменная даты, со значением по умолчанию -- «прямо сейчас», которая не может быть NULL
l_right_now DATE NOT NULL DEFAULT SYSDATE;
-- Использование оператора присваивания для указания -- значения по умолчанию
l_favorite_flavor VARCHAR2(100) := 'Anything with chocolate, actually';
-- Двухэтапное объявление ассоциативного массива.
-- Сначала табличный тип:
TYPE list_of_books_t IS TABLE OF book%ROWTYPE INDEX BY BINARY_INTEGER;
-- Затем тот конкретный список, который будет -- обрабатываться в данном блоке:
oreilly_oracle_books list_of_books_t;
Для задания значения по умолчанию ключевое слово DEFAULT и оператор присваивания эквиваленты и взаимозаменяемы. Что же следует использовать? Я предпочитаю использовать оператор присваивания (:=) для указания значений по умолчанию для констант, а ключевое слово DEFAULT - для переменных. Для констант присваиваемое значение в действительности является не значением по умолчанию, а исходным (и неизменным) значением, поэтому использование DEFAULT кажется мне неуместным.
Объявление констант PL/SQL
Существует всего два отличия в объявлениях переменных и констант: объявление константы включает в себя ключевое слово CONSTANT, и в нем обязательно указывается значение по умолчанию (которое на самом деле является не значением по умолчанию, а единственно возможным значением). Синтаксис объявления константы будет таким:
имя CONSTANT тип_данных [NOT NULL] := | DEFAULT значение_по_умолчанию;
Значение константы задается в момент объявления и впоследствии не может быть изменено.
Рассмотрим несколько примеров объявления констант:
DECLARE
-- Текущий год; это значение не изменится в течение сеанса. l_curr_year CONSTANT PLS_INTEGER :=
TO_NUMBER (TO_CHAR (SYSDATE, 'YYYY'));
-- Использование ключевого слова DEFAULT
l_author CONSTANT VARCHAR2(100) DEFAULT 'Bill Pribyl';
-- Объявления объектного типа как константы.
-- Константы не обязаны быть скалярными!
l_steven CONSTANT person_ot := person_ot ('HUMAN', 'Steven Feuerstein', 175, '09-23-1958');
Если не указано иное, то информация, приводимая в последующих разделах главы для переменных, справедлива и для констант.
Объявления с привязкой в PL/SQL
Привязка типа данных означает, что вы указываете компилятору PL/ SQL на необходимость назначения типа данных переменной на основе типа данных уже определенной структуры данных: другой переменной PL/SQL, предопределенного типа или подтипа, таблицы базы данных или какого-то столбца таблицы. PL/SQL поддерживает две разновидности привязки:
Скалярная привязка
Используйте атрибут %TYPE для определения переменной на основе столбца таблицы или какой-то другой скалярной переменной PL/ SQL.
Привязка к записи
Используйте атрибут %ROWTYPE для определения записи на основе таблицы или предопределенного явного курсора PL/SQL.
Синтаксис объявления типа данных с привязкой будет таким:
имя_переменной aтрибу%TYPE [необязательное присваивание значения по умолчанию];
имя_переменной имя_таблицы\имя_курсора%ROWTYPE [необязательное присваивание значения по умолчанию];
где имя_переменной - это имя объявляемой переменной, а атрибут - это имя объявленной ранее переменной PL/SQL или же указание столбца таблицы в формате «таблица.столбец».
Приведем пример привязки переменной к столбцу таблицы базы данных:
l_company_id company.company_id%TYPE;
Теперь рассмотрим пример привязки записи к курсору:
DECLARE
CURSOR book_cur IS
SELECT author, title FROM book;
l_book book_cur%ROWTYPE;
Ссылка на привязку вычисляется при компиляции, что не увеличивает времени выполнения программы. Привязка устанавливает зависимость между кодом и элементом, к которому выполняется привязка (таблицей, курсором или пакетом, содержащим переменную, на которую ссылается объявление типа). При изменении такого элемента привязанный к нему код помечается как INVALID. При повторной компиляции привязка будет восстановлена, так что код всегда будет соответствовать текущему состоянию элемента.