Объявление переменных, констант и привязок в PL/SQL

Стас Белков

Стас Белков

Автор статьи. Известный специалист в мире IT. Консультант по продуктам и решениям Oracle. Практикующий программист и администратор баз данных. Подробнее.

Переменные и константы в PL/SQLПри обращении к переменной или константе, необходимо ее объявить (единственным исключением из этого правила являются индексные переменные циклов 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. При повторной компиляции привязка будет восстановлена, так что код всегда будет соответствовать текущему состоянию элемента.

Вас заинтересует / Intresting for you:

Oracle Text и PL/SQL: многоязы...
Oracle Text и PL/SQL: многоязы... 3497 просмотров Максим Николенко Fri, 18 Oct 2019, 12:41:03
Сопровождение объектных типов ...
Сопровождение объектных типов ... 3728 просмотров Максим Николенко Sun, 03 Nov 2019, 09:18:04
 Версии PL/SQL и Oracle 12c
Версии PL/SQL и Oracle 12c 3425 просмотров Александров Попков Tue, 21 Nov 2017, 13:28:01
Структура блока PL/SQL
Структура блока PL/SQL 8212 просмотров Илья Дергунов Tue, 10 Jul 2018, 06:35:51
Войдите чтобы комментировать

apv аватар
apv ответил в теме #9251 5 года 6 мес. назад
Ну да, без соплей - все чОтенько по делу. Профессионально, так сказать...
AidaU аватар
AidaU ответил в теме #9216 5 года 7 мес. назад
Соглашусь, хороший блог получился)
ildergun аватар
ildergun ответил в теме #8972 6 года 1 мес. назад
Великолепная шпаргалка по работе с переменными и константами PL SQL для начинающих программистов! Подписываюсь на ваш блог)