Структура блока PL/SQL
Каждая программа на PL/SQL представляет собой блок, состоящий из стандартного набора элементов, обозначенных ключевыми словами. Блок определяет область видимости объявленных переменных, порядок обработки и передачи исключений.
Структура блока определяется следующей синтаксической конструкцией:
[CREATE OR REPLACE имя [(параметр тип_данных [, параметр тип_данных … ])
{IS | AS}] --раздел заголовка
[[DECLARE]
переменная тип_переменной;
[переменная тип_переменной;…]] --раздел объявлений
BEGIN
выполняемый_код;
[выполняемый_код; ...] --раздел выполнения
[EXCEPTION
код_исключения;
[код_исключения;….]] --раздел исключений
END;
Назначение секций:
- раздел заголовка определяет имя блока, необходим для именованных блоков и недопустим в анонимных.
- раздел объявлений содержит объявления переменных, констант, курсоров, типов и локальных программ, используемых в данном блоке. Может отсутствовать.
- раздел выполнения содержит выполняемый код. Обычно присутствует, но необязателен в спецификациях пакетов и типов.
- раздел исключений. Определяет обработку исключений. Может отсутствовать.
Разделы выполнения и исключений могут содержать в себе подблоки (вложенные блоки).
Самый простой блок, который возможно создать будет выглядеть так:
BEGIN
NULL;
END;
Раздел заголовка
В секции заголовка указывается имя блока PL/SQL или программного модуля. Наличие или отсутствие этой секции определяется типом блока PL/SQL.
Есть два основных типа блоков:
1) Анонимный блок создается динамически и выполняется только один раз. Как правило, такой блок создается в клиентской программе для вызова подпрограмм, хранящихся в БД, и не может быть вызван из-за пределов содержащего его блока. Необязательная секция объявлений начинается ключевым словом DECLARE. Анонимный блок имеет вид:
DECLARE
Today DATE DEFAULT SYSDATE;
BEGIN
--Вывести дату
DBMS_OUTPUT.PUT_LINE (‘Сегодня’|| today);
END;
2) Именованный блок может быть разделён на 3 подвида:
- помеченные блоки – это анонимные блоки с меткой. Метка позволяет ссылаться на переменные, которые иначе были бы недоступны. Метка задается перед ключевым словом DECLARE или после ключевого слова END.
пример
- подпрограммы – это процедуры и функции, которые могут храниться в БД, как автономные объекты, как часть пакета или как метод объектного типа. Подпрограммы обычно не изменяются и выполняются неоднократно, могут быть объявлены в других блоках. Независимо, где они объявлены, выполняются явно посредством вызова процедуры или функции, для обозначения секции объявлений не применяется ключевое слово DECLARE. Пример блока этого типа:
CREATE OR REPLACE PROCEDURE show_the_date
IS
Today DATE DEFAULT SYSDATE;
BEGIN
--вывести дату
DBMS_OUTPUT.PUT_LINE(‘сегодня’||today);
END show_the_date;
- Триггеры – именованные блоки, которые ассоциируются с некоторым событием, происходящим БД. Обычно не изменяются и выполняются многократно неявным образом при наступлении соответствующих событий (INSERT, UPDATE, DELETE, CREATE, ALTER, DROP, запуск и останов сеанса работы с БД и др.).
Параметры. В секции заголовка именованного блока могут быть объявлены параметры. Параметры, если они присутствуют, заключены в скобки и разделены запятыми.
В процедурах, функциях и курсорах параметры служат для передачи информации между подпрограммой и вызывающей программой. Параметры перечисляются в списке, содержащем один или более параметров. В определение каждого параметра вводят его имя, тип данных, назначение и (необязательно) значение по умолчанию.
Синтаксис определения параметров:
имя_параметра [назначение] [NOCOPY] тип_данных [(:=|DEFAULT | значение)]
Ключевые слова
Назначение – указывает, будет ли параметр использован для получения или возврата значений. Может принимать следующие значения:
IN – входной параметр только для чтения. Значение фактического параметра можно использовать внутри программы, но оно не может быть изменено. Этот режим установлен по умолчанию.
OUT – выходной параметр, внутри подпрограммы рассматривается как неинициализированная переменная, т.е. в него можно как записать значение, так и считать из него.
IN OUT – параметр для чтения и записи. Значение фактического параметра передается в процедуру при ее вызове. Внутри процедуры формальный параметр рассматривается как инициализированная переменная, при чем можно как записать в него значение, так и считать значение из него.
Если в ходе выполнения процедуры или функции возникают исключения, то исключения, присвоенные параметрам типа OUT и IN OUT теряются, если только не дана подсказка NOCOPY.
NOCOPY – это подсказка компилятору использовать передачу параметра по ссылке, а не по значению. По умолчанию PL/SQL передаёт параметр типа IN OUT по значению, создавая его копию в подпрограмме. Когда параметр содержит много данных для передачи, например, является коллекцией или объектом, то такое копирование замедляет работу, требует много памяти. NOCOPY указывает PL/SQL, что параметр передаётся по ссылке при помощи указателя на единственный экземпляр параметра. Недостаток применения NOCOPY в том, что при возникновении исключения в процессе выполнения программы, которая изменяет параметр типа OUT или IN OUT значения реальных параметров не откатываются, т.к. они передавались по ссылке, а не по значению.
тип_данных – может быть любым типом данных PL/SQL или пользовательским типом, может быть ограничен в размере. Фактический размер параметра определяется вызывающей программой или ограничением %TYPE.
CREATE OF REPLACE PROCEDURE empid_to_name
(in_id emp.emp_id%TYPE; --компилируется успешно
, out_last_nаme VARCHAR2; --компилируется успешно.
, out_first_name VARCHAR2(10); --не компилируется.
) IS
…
Длина out_last_name и out_first_name определяется вызывающей программой:
DECLARE
surname VARCHAR2(10);
first_name VARCHAR2(10);
BEGIN
Empid_to_name(10, surname, first_name);
END;
DEFAULT – указывает значение по умолчанию для входного (IN) параметра. Если входной параметр имеет значение по умолчанию, то можно не указывать его значение явно при вызове программы. Если при вызове значение не указано, автоматически будет поставлено значение по умолчанию.
Следует различать формальные и фактические параметры. Формальные параметры – это имена, объявляемые в заголовке процедуры или функции, а фактические – это значения или выражения, помещаемые в список параметров при вызове функции или процедуры.