Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
12,14.doc
Скачиваний:
14
Добавлен:
26.09.2019
Размер:
124.42 Кб
Скачать

Лекция 14 Хранимый код. Триггеры

14.1. Процедурные расширения языка sql

Как мы показали в предыдущих лекциях, язык SQL является очень мощным языком манипулирования данными, однако для решения сложных задач обработки данных ему не хватает управляющих конструкций, имеющихся в универсальных языках программирования. В связи с этим многие СУБД имеют процедурные расширения этого языка, которые представляют собой полноценный язык программирования, поддерживающий возможность использования в нем операторов SQL. На таком языке можно писать процедуры и функции, постоянно хранящиеся в базе данных и исполняемые в среде СУБД.

К сожалению, на настоящий момент ситуация такова, что каждая СУБД поддерживает свой собственный язык процедурного расширения SQL, что усложняет задачи переносимости программного обеспечения. Поэтому те примеры, которые будут приведены в этой лекции, используют процедурный язык PL/SQL, поддерживаемый Oracle, и работают только в среде этой СУБД. Из других процедурных расширений наиболее близок к PL/SQL язык СУБД PostgreSQL, который называется PLG/SQL. Используемое в Microsoft SQL Server процедурное расширение Transact-SQL по синтаксическим конструкциям отличается от PL/SQL, но по семантике является близким. Во всяком случае, понимание логики разработки хранимого кода на PL/SQL поможет легко освоить и любое другое процедурное расширение.

Для дальнейшего изложения вначале необходимо привести минимальные сведения по конструкциям языка PL/SQL. По синтаксису он наиболее близок языку программирования ADA, конструкции его очень логичны. Основной программной единицей является блок – совокупность операторов, заключенная в операторные скобки BEGIN ... END. При выполнении процедурных действий в блоке, как правило, необходимы переменные для хранения промежуточных значений. Объявление переменных предшествует блоку и образует секцию объявления, которая начинается ключевым словом DECLARE. Для переменных поддерживаются те же типы, что и для столбцов таблиц Oracle. Имеется возможность указать тип переменной, явно ссылаясь на определенный столбец или таблицу. Например:

DECLARE

x INTEGER;

fio students.name_st%type;

s subjects%type;

BEGIN

. . .

END

В приведенном примере для переменной x тип указан явно, переменная fio имеет такой же тип, как столбец name_st таблицы students, переменная s имеет тип запись (RECORD), структура которой идентична строке таблицы subjects (содержит два поля cod_sub и name_sub).

Операторы языка pl/sql

1. Оператор присваивания

переменная:= выражение;

2. Условный оператор

IF условие THEN

оператор1; оператор2;

...

[ELSIF условие THEN

оператор3; оператор4;

...]

[ELSE

оператор5; оператор6;

...]

END IF;

3. Операторы цикла

Бесконечный цикл, условие выхода задается в теле цикла

LOOP

оператор1; оператор2;

...

EXIT WHEN условие выхода из цикла;

END LOOP;

Цикл с предусловием

WHILE условие LOOP

оператор1; оператор2;

...

END LOOP;

Цикл с параметром

FOR параметр IN (множество значений) LOOP

оператор1; оператор2; ...

END LOOP;

Множество значений параметра обычно задается в виде диапазона

(начальное_значение .. конечное_значение)

5. Оператор безусловного перехода:

GOTO метка;

...

метка: оператор;

6. Оператор возврата из процедуры/функции

RETURN;

RETURN выражение; (только функции)

7. Комментарии

Однострочный комментарий обозначается так:

-- далее следует текст комментария до конца строки

Многострочный комментарий обозначается аналогично языку С:

/* текст комментария может располагаться где угодно и занимать сколько угодно строк */

8. Средства для обработки исключительных ситуаций

Общий подход к обработке исключительных ситуаций состоит в том, что для каждой ситуации определяется ее обработчик и при возникновении ситуации выполняется код обработчика. В PL/SQL предусмотрена возможность как обрабатывать стандартные ситуации, так и вводить собственные исключительные ситуации. Предусматриваются также средства генерации исключительных ситуаций.

Для стандартных исключительных ситуаций существует большое число предустановленных имен. Пользовательская исключительная ситуация вводится объявлением переменной типа EXCEPTION. Генерация исключений из программы выполняется в PL/SQL оператором RAISE.

Обработчик исключений в PL/SQL, общий для всех исключений, составляет отдельную часть блока PL/SQL, начинающуюся со слова EXCEPTION и содержащую набор операторов WHEN, распознающих типы исключений и задающих действия, выполняемые по каждому типу (возможны любые действия, которые можно запрограммировать средствами PL/SQL).

Например:

DECLARE

err EXCEPTION;

BEGIN

INSERT INTO … VALUES … ;

SELECT ... INTO …;

IF ... THEN

RAISE err;

...

EXCEPTION

WHEN DUPLICATE_KEYS THEN

...

WHEN TOO_MANY_ROWS THEN

...

WHEN err THEN

...

WHEN OTHERS THEN

...

END;

В приведенном примере имеется два предопределенных имени для стандартных исключительных ситуаций, возникающих в процессе выполнения команд INSERT и SELECT …INTO и предопределенное имя OTHERS, предназначенное для обозначения любой другой исключительной ситуации, которую процедура отдельно не обрабатывает. Переменная err предназначена для возбуждения пользовательской исключительной ситуации при помощи оператора RAISE.

Как видим из приведенного примера, блок PL/SQL может содержать команды языка SQL, которые органично сочетаются с операторами языка высокого уровня. Эта тема заслуживает отдельного обсуждения, поскольку механизм встраивания команд в язык высокого регламентируется стандартом SQL и практически одинаков во всех СУБД.