Структура программы PL/SQL
Структура блока
В PL/SQL, как и в большинстве процедурных языков программирования, наименьшей единицей группировки исходного кода является блок. Он представляет собой фрагмент кода, определяющий границы выполнения кода и области видимости для объявлений. Блоки могут вкладываться друг в друга.
Разделы блока PL/SQL
Блок PL/SQL состоит из четырех разделов:
раздел заголовка;
раздел объявлений;
исполняемый раздел;
раздел обработки исключений.
Разделов заголовка, объявлений и обработки исключений в блоке может не быть, обязательным является только исполняемый раздел.
Синтаксически блок PL/SQL выглядит следующим образом:
раздел заголовка
DECLARE
раздел объявлений
BEGIN
исполняемый раздел
EXCEPTION
раздел обработки исключений
END;
В разделе заголовка указываются:
тип блока (процедура, функция);
имя блока (имя процедуры, функции);
имена параметров, их типы данных и режимы передачи значений.
В разделе объявлений объявляются пользовательские типы данных, переменные и константы, которые потом используются в исполняемом разделе и разделе обработки исключений. В исполняемом разделе реализуется собственно логика программы. В вырожденном случае там может присутствовать только одна «пустая» команда NULL. Обработка исключений рассматривается далее в отдельном параграфе.
Ключевые слова BEGIN и END в языке PL/SQL являются операторными скобками, подобными символам { и } в других языках программирования и отмечают начало исполняемого раздела и конец блока. Каждая команда в PL/SQL должна завершаться точкой с запятой (символом ; ).
Виды блоков PL/SQL
В PL/SQL есть два вида блоков:
именованные блоки (с разделом заголовка);
анонимные блоки (без раздела заголовка).
Именованные блоки в свою очередь тоже бывают двух видов:
именованные блоки хранимых в базе данных программ (процедур, функций, пакетов и триггеров);
именованные блоки в разделах объявлений других блоков (анонимных или именованных).
Хранимые программы (stored programs) являются объектами базы данных Oracle и создаются DDL-командой CREATE, после которой записывается именованный блок PL/SQL. Имя блока, указанное в разделе заголовка, будет являться именем объекта базы данных.
Анонимные блоки (anonymous blocks) раздела заголовка не имеют. Если блок не имеет раздела заголовка, то он не имеет и имени, которое в этом разделе указывается, поэтому такие блоки и называются анонимными.
Анонимные блоки либо вкладываются в другие блоки, либо хранятся в виде текстовых файлов-сценариев. В последнем случае анонимные блоки, как правило, используются для вызова хранимых программ или для автоматизации задач администрирования баз данных.
Анонимный блок-сценарий file1.sql
Вложенные анонимные блоки
в именованном блоке хранимой программы
DECLARE
i INTEGER;
именованный блок процедуры proc1
в разделе анонимного блока
PROCEDURE proc1 IS
BEGIN
NULL;
END;
BEGIN
вызов процедуры proc1
proc1;
END;
именованный блок процедуры proc2
CREATE PROCEDURE proc2 AS
BEGIN
родительский анонимный блок,
вложенный в именованный proc2:
DECLARE
BEGIN
еще один анонимный блок
вложенный в родительский:
DECLARE
BEGIN
NULL;
END; конец вложенного блока
END; конец родительского блока
END; конец именованного блока proc2
Комментарии
В любом месте исходного кода на PL/SQL могут быть комментарии, однострочные и многострочные.
Однострочные комментарии начинаются с двух дефисов (символы ). Весь текст после двух дефисов и до конца строки рассматривается как комментарий и игнорируется компилятором. Если два дефиса стоят в начале строки, то комментарием является вся строка.
Многострочный комментарий размещается между начальным (/*) и конечным (*/) ограничителями. Вложение многострочных комментариев друг в друга не допускается.
Тема комментирования исходного кода заслуживает отдельного рассмотрения. Авторы книги являются сторонниками следующего принципа: «Комментируйте неочевидные участки кода. Не комментируйте очевидные».
О том, как следует комментировать код, есть несколько хороших статей, также эта тема подробно рассмотрена в книгах, посвященных выработке хорошего стиля программирования. Особое внимание следует уделить тому, чтобы тексты комментариев соответствовали актуальной версии кода. Довольно часто после внесения изменений в коде забывают их отразить в комментариях.
Переменные и константы PL/SQL
Приведем пример анонимного блока, в котором объявлены одна константа и две переменные, а в исполняемом разделе выполняются действия по вычислению натуральных логарифмов чисел 2 и 3.
/* Вычисление
двух логарифмов */
SQL> DECLARE
2 header1 CONSTANT VARCHAR2(20) := 'Логарифм двух равен ';
3 header2 CONSTANT VARCHAR2(20) := 'Логарифм трех равен ';
4 arg INTEGER := 2;
5исполняемый раздел
6 BEGIN
7 DBMS_OUTPUT.PUT_LINE(header1||LN(arg));
8 arg := arg+1;
9 DBMS_OUTPUT.PUT_LINE(header2||LN(arg));
10 END;
11 /
Логарифм двух равен .6931471805599453094172321214581765680782
Логарифм трех равен 1.09861228866810969139524523692252570465
PL/SQL procedure successfully completed.
В разделе объявлений можно объявлять как переменные, так и константы (с помощью ключевого слова CONSTANT). Константа отличается от переменной тем, что ее значение нельзя изменять после объявления. Если указать константу в левой части оператора присваивания и т. п., то это будет определено как ошибка еще на этапе компиляции. Переменным присваивать значения можно в любом разделе, в том числе прямо при ее объявлении в разделе объявлений. По умолчанию переменная инициализируется «пустым» значением NULL.
Имена констант, переменных, пользовательских типов данных в грамматике PL/SQL называются идентификаторами. К идентификаторам предъявляются следующие требования:
идентификатор должен состоять только из букв, цифр и символов _$#
идентификатор должен начинаться с буквы;
длина идентификатора должна быть до 30 символов;
идентификатор не должен быть зарезервированным словом.
Примеры недопустимых идентификаторов:
2_name (начинается не с буквы, правильноl_second_name);
l_exchange_rate_on_current_date (длина свыше 30 символов).
Рекомендуется блокам PL/SQL, пользовательским типам данных, переменным и константам давать имена, соответствующие некоторому соглашению об именовании.
В языке PL/SQL переменные, константы и пользовательские типы данных являются локальными для блока, в котором они объявлены. Когда выполнение блока будет завершено, все эти объекты внутри программы становятся недоступными. Можно сказать, что у каждого объявленного в программе PL/SQL элемента имеется некоторая область видимостиучасток программы, в котором можно ссылаться на этот элемент (блок, в котором элемент объявлен, и все вложенные в него блоки).
Структуры управления вычислениями
Известно, что для реализации алгоритмов на процедурном языке программирования требуется наличие в нем трех следующих структур управления вычислениями, причем должна быть возможность вкладывать все структуры друг в друга произвольным образом:
последовательность команд (выполнение команд согласно их упорядоченности);
выбор (проверка условия и выполнение той или иной последовательности команд в зависимости от истинности или ложности условия);
повторение (выполнение последовательности команд до тех пор, пока условие повторения принимает истинное значение).
Рис. 1. Структуры управления вычислениями.
Команды, указанные в коде PL/SQL, выполняются последовательно. Такая схема называется потоком команд, то есть первая требуемая структура управления вычислениями (последовательность) в PL/SQL имеется. Рассмотрим языковые конструкции PL/SQL для выбора и повторения (условные команды, команды перехода и циклы).
Условные команды и команды перехода
В PL/SQL к условным командам относятся команды IF и CASE, переходы реализуются командами GOTO и NULL.
Условная команда IF
Условная команда IF позволяет проверить заданное логическое условие и, в зависимости от результатов проверки (TRUE, FALSE или UNKNOWN), выполнить различные ветви кода. В PL/SQL имеется три формы команды IF: