Базовая структура кода
Базовый блок PL/SQL
Блоком в PL/SQL называется исполняемая программа. Блок кода PL/SQL, независимо от того, инкапсулируется он внутри какой-то программной единицы наподобие процедуры или задается в виде анонимного блока в свободной форме, состоит из следующих структур, которые представляют собой четыре ключевых оператора, только два из которых являются обязательными.
DECLARE. Этот оператор является необязательным и представляет собой то место, в котором при желании объявляются переменные и курсоры программы.
BEGIN. Этот оператор является обязательным и указывает, что далее будут идти операторы SQL и PL/SQL, т.е. обозначает начало блока кода PL/SQL.
EXCEPTION. Этот оператор является необязательным и описывает методы обработки ошибок.
END. Этот оператор является обязательными и обозначает конец блока кода PL/SQL.
Ниже приведен пример простого блока кода PL/SQL:
DECLARE isbn NUMBER(9)
BEGIN
isbn := 123456789;
insert into book values (isbn, 'databases', 59.99);
COMMIT;
END;
Анонимные блоки
Анонимный блок представляет собой контейнер для хранения команд PL/SQL — обычно с вызовами процедур и функций. Поскольку анонимные блоки могут содержать собственные разделы объявлений и исключений, разработчики часто используют вложение анонимных блоков для ограничения области видимости идентификаторов и организации обработки исключений в более крупных программах.
Пример:
BEGIN
DBMS_OUTPUT.PUT_LINE ('Hello world');
END;
Общий синтаксис анонимного блока PL/SQL:
[ DECLARE ... объявления ... ]
BEGIN ... одна или несколько исполняемых команд ...
[ EXCEPTION
... команды обработки исключений ... ]
END;
Квадратными скобками обозначаются необязательные составляющие синтаксиса. Анонимный блок обязательно содержит ключевые слова BEGIN и END, и между ними должна быть как минимум одна исполняемая команда.
Анонимный блок выполняет серию команд, а затем завершает свою работу, то есть по сути является аналогом процедуры. Фактически каждый анонимный блок является анонимной процедурой. Они используются в различных ситуациях, в которых код PL/ SQL выполняется либо непосредственно, либо как часть другой программы.
Именованные блоки
Хотя анонимные блоки PL/SQL применяются во многих приложениях Oracle, вероятно, большая часть написанного вами кода будет оформлена в виде именованных блоков. Их главной особенностью является наличие заголовка. Заголовок процедуры выглядит так:
PROCEDURE [схема.]имя [ ( параметр [, параметр ... ] ) ]
[AUTHID {DEFINER | CURRENT_USER}]
Заголовок функции в целом очень похож на него, но дополнительно содержит ключевое слово RETURN:
FUNCTION [схема.]имя [ ( параметр [, параметр ... ] ) ]
RETURN возвращаемый_тип
[AUTHID {DEFINER | CURRENT_USER}]
[DETERMINISTIC]
[PARALLEL ENABLE ...]
[PIPELINED [USING...] | AGGREGATE USING...]
Вложенные блоки
PL/SQL, как и языки Ada и Pascal, относится к категории языков с блочной структурой, то есть блоки PL/SQL могут вкладываться в другие блоки. С другой стороны, язык C тоже поддерживает блоки, но стандартный C не является строго блочно-структурированным языком, потому что вложение подпрограмм в нем не допускается.
В следующем примере PL/SQL показана процедура, содержащая анонимный вложенный блок:
PROCEDURE calc_totals
IS
year_total NUMBER;
BEGIN
year_total := 0;
/* Начало вложенного блока */
DECLARE
month_total NUMBER;
BEGIN
month_total := year_total / 12;
END set_month_total;
/* Конец вложенного блока */
END;
Ограничители /* и */ обозначают начало и конец комментариев (см. раздел «Комментарии» далее в этой главе). Анонимные блоки также могут вкладываться более чем на один уровень:
DECLARE
CURSOR emp_cur IS ...;
BEGIN
DECLARE
total_sales NUMBER;
BEGIN
DECLARE
l_hiredate DATE;
BEGIN
...
END;
END;
Вопросы для самопроверки
- Что такое блоком в PL/SQL?
- Из каких структур состоит блок PL/SQL?
- Какая главная особенность именованного блока?
- Присутствую ли в PL/SQL вложенные блоки?
- Какая стуркутра блока позволяет обрабатывать ошибки?
Упражнения
- Напишите пример простого блока кода PL/SQL
- Напишите пример именованного блока кода PL/SQL
- Напишиет простую процедуру суммирования,содержащую анонимный вложенный блок