Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции по бд.doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
4.79 Mб
Скачать

Триггеры и хранимые процедуры (InterBase) sql для триггеров и хранимых процедур в InterBase

SQL для триггеров и хранимых процедур в InterBase представляет собой законченный язык программирования для манипулирования дан­ными.

Язык включает:

  • инструкции манипуляции данных SQL: добавление, модификация, удаление из базы, выборка данных из базы в список переменных.

  • операторы SQL и выражения, включая функции пользователя (UDF – user defined functions), расширение SQL, включающее оператор присвоения, операторы управления последовательностью вычислений, возможность использова­ния собственных и контекстных переменных, операторы генерации собы­тий и исключений (ошибок), а также команды обработки ошибок.

При работе с данными используются следующие операции (перечень дан в порядке убывания их приоритета):

  • операция конкатенации (объединения) для строковых данных – "||"

  • арифметические операции

* / + –

  • операции сравнения

=, ==

<>, !=, ~=, ^= (не равно)

>, <, >=, <=, !>, ~>, ^> (не больше), !<, ~<, ^< (не меньше)

  • логические операции

NOT, AND, OR

Хотя хранимые процедуры и триггеры используются различным об­разом и в разных целях, они базируются на одном и том же языке. И хра­нимые процедуры, и триггеры могут использовать любые конструкции языка, за исключением следующих:

  • Контекстные переменные допустимы только в триггерах.

  • Входные и выходные параметры, а также инструкции SUSPEND и EXIT, которые возвращают значения, применимы только в хранимых процедурах.

Прежде чем продолжить, уточним терминологию.

  • Оператор DECLARE – это оператор объявления переменных.

  • Блок (<block>) – это один или несколько операторов (<compound_statement>), заключенных в операторные скобки BEGIN END.

  • Оператор (<compound_statement>) – это простой оператор (statement) или блок.

  • Формализованная запись:

< block> ::= BEGIN

< compound_statement>

[< compound_statement> ...] END

< compound_statement> ::= {< block> | statement;}

  • Простые операторы: оператор присвоения, оператор генерации ис­ключения, оператор вызова процедуры, оператор ветвления IF, оператор цикла FOR, оператор цикла WHILE, оператор генерации события POST_EVENT, операторы SQL INSERT, UPDATE, SELECT, оператор возврата значений выходных параметров SUSPEND, оператор прерыва­ния процедуры EXIT, оператор обработки ошибок WHEN.

  • Кроме того, для удобства сопровождения программ в их текст могут быть внесены комментарии.

Рассмотрим подробнее перечисленные операторы.

ОПЕРАТОР ПРИСВОЕНИЯ

Синтаксис:

variable = < expression>;

variable – локальная переменная, входной или выходной параметр, контекстная переменная.

<expression> – любое допустимое в SQL выражение, включающее переменные, операторы SQL, пользовательские (UDF) функции и генера­торы, выражения в скобках.

ОПЕРАТОР ОБЪЯВЛЕНИЯ ПЕРЕМЕННЫХ DECLARE

Оператор DECLARE применяется в хранимых процедурах и тригге­рах и размещается в начале их тела непосредственно перед скобкой BEGIN, за которой размещаются все исполнимые операторы. Все исполь­зуемые переменные должны быть объявлены. Оператор объявления за­вершается «;». Одним оператором может быть объявлена только одна пе­ременная, и объявления имеют смысл только внутри хранимой процеду­ры или триггера.

Синтаксис:

DECLARE VARIABLE var datatype;

ОПЕРАТОР ГЕНЕРАЦИИ ИСКЛЮЧЕНИЯ

Генерирует сообщение об ошибке (исключение). Применяется в хра­нимых процедурах и триггерах.

Синтаксис:

EXCEPTION name;

name – имя генерируемого исключения. Исключение с данным именем должно быть предварительно создано в базе командой CREATE EXCEPTION.

CREATE EXCEPTION

Описание

CREATE EXCEPTION создает исключительную ситуацию, определенную пользователем ошибку, с которой ассоциировано сообщение. Исключительные ситуации могут быть подняты в триггерах и сохраненных процедурах.

Исключительные ситуации глобальны для базы данных. То же самое сообщение или набор сообщений доступно всем сохраненным процедурам и триггерам в приложении. Для примера, база данных может иметь English и French версии тех же самых сообщений исключительных ситуаций и использовать соответствующий набор по необходимости.

Когда исключительная ситуация поднята триггером или сохраненной процедурой, она:

  • Завершает триггер или процедуру, которой она вызвана и отменяет любые, выполненные ими действия (прямо или косвенно).

  • Выводит сообщение об ошибке.

Исключительные ситуации могут быть отслежены и обработаны в сохраненной процедуре или триггере с помощью инструкции WHEN.

Синтаксис

CREATE EXCEPTION name "<message>";

Аргумент

Описание

name

Имя, которое ассоциировано с сообщением исключительной ситуации. Должно быть уникальным среди имен исключительных ситуаций в базе данных.

"<message>"

Строка, заключенная в кавычки, содержащая буквенно-цифровые символы и знаки пунктуации. Максимальная длина: 78 символов.

Примеры

Следующая инструкция создает UNKNOWN_EMP_ID исключительную ситуацию:

CREATE EXCEPTION UNKNOWN_EMP_ID "Invalid employee number or project id.";

Следующий фрагмент из сохраненной процедуры поднимает, предварительно установленную исключительную ситуацию, когда SQLCODE принимает значение -530, которое является нарушением ограничения FOREIGN KEY:

...

WHEN SQLCODE -530 DO

EXCEPTION UNKNOWN_EMP_ID;

...

ОПЕРАТОР ВЫЗОВА ПРОЦЕДУРЫ

Оператор осуществляет вызов хранимой процедуры. Применяется в хранимых процедурах и триггерах.

Синтаксис:

EXECUTE PROCEDURE name [LIST_: param] [RETURNING_VALUES LIST_:param];

name – имя вызываемой процедуры. Сама процедура должна быть пред­варительно создана в базе командой CREATE PROCEDURE.

LIST_: param ::=:param [, LIST_: param], заданный после имени про­цедуры name – это список входных параметров процедуры (если проце­дура не требует параметров, то может отсутствовать). Отдельные пара­метры могут быть константами или переменными. Перед именем пере­менной ставится «:», кроме случаев использования контекстных переменных NEW и OLD.

LIST_:param, заданный после RETURNING_VALUES – список возвращаемых процедурой значений (если процедура возвращает значения). Перед именем возвращаемых значений ставится «:». В триггерах и процедурах использование вызовов других процедур аналогично использованию подпрограмм в традиционных алго­ритмических языках.

Замечание. При вызове из ISQL или прикладных программ на базо­вых языках синтаксис вызова отличается от приведенного.

ОПЕРАТОР ВЕТВЛЕНИЯ

Оператор ветвления IF ... THEN ... ELSE обеспечивает выполнение того или иного действия в зависимости от истинности проверяемого ус­ловия.

Синтаксис:

IF ( <condition>) THEN <compound_statement> [ELSE <compound_statement>]

<compound_statement> ::= {< block> | statement;} (см. выше)

<condition> – выражение, которое может принимать значение истина или ложь.

Если условие выполнено (значение TRUE), то выполняется оператор, следующий за конструкцией THEN, иначе выполняется оператор, сле­дующий за конструкцией ELSE, если она присутствует.

Например:

IF (a<0) THEN

b = -а; ELSE

b = а;

Оператор цикла FOR

Цикл FOR обеспечивает выполнение заданного оператора для каж­дой строки команды SELECT. Цикл FOR может использоваться в храни­мых процедурах и триггерах.

Синтаксис:

FOR

< select_expr> DO

< compound_statement>

FOR SELECT – инструкция цикла, которая отыскивает строку, ука­занную в <select_expr> и для каждой строки исполняет оператор или блок, указанный после ключевого слова DO.

Конструкция <select_expr> представляет собой обычную команду SELECT, к которой добавлена обязательная здесь опция INTO и которая должна быть последней опцией команды SELECT.

В опции INTO перечисляются имена локальных переменных или па­раметров процедуры, которым присваиваются соответствующие значения выбранных командой SELECT столбцов. Имена переменных должны предваряться символом":".

В качестве примера возьмем фрагмент процедуры PAUTHOR.

FOR SELECT AUTHOR, AUNAME FROM TAUTHOR

INTO :AUTHOR, :AUNAME DO

IF(AUNAME>P1) THEN IF(AUNAME<P2) THEN SUSPEND;

Здесь оператор SUSPEND обеспечивает передачу вызывающему приложению данных, удовлетворяющих дополнительному условию.

ОПЕРАТОР ЦИКЛА WHILE

Оператор цикла WHILE обеспечивает выполнение оператора, ука­занного после ключевого слова DO пока указанное после WHILE условие истинно. Цикл WHILE может использоваться в хранимых процедурах и триггерах.

Синтаксис:

while ( <condition>) DO <compound_statement>

WHILE ... DO – оператор выполнения цикла, который повторяет опера­тор или блок <compound_statement>, указанный после DO, пока условие <condition> истинно. Условие проверяется в начале каждого цикла. В качестве примера рассмотрим вычисление факториала.

S = 1;

WHILE (I > 0) DO

BEGIN

S = S * I;

I = I - 1;

END

ОПЕРАТОР ГЕНЕРАЦИИ СОБЫТИЯ POST_EVENT

Оператор POST_EVENT используется для генерации события, кото­рое может быть в дальнейшем обработано в приложениях.

Сама обработка событий в InterBase строится по следующей схеме.

  1. Приложение выдает команду EVENT INIT request_name (event_namel [, event_name2 ...]);

По этой команде создается список событий request_name, со­держащий имена событий event_namel ,event_name2 ...

  1. То же или другое приложение выдает команду EVENT WAIT request_name;

По этой команде приложение приостанавливается и ожидает наступления одного из событий в списке request_name.

  1. Само событие генерируется внутри триггера или хранимой процедуры командой POST_EVENT. После того как такое со­бытие произошло, приложение, ожидающее событие, получает соответствующее сообщение и продолжает свою работу. Такой механизм позволяет приложениям обрабатывать различные специфические ситуации при работе с базой данных.

Внутри триггеров и хранимых процедур реализуется только коман­да POST_EVENT.

Синтаксис:

POST_EVENT <event_name>;

Параметр <event_name> может быть либо символьным литералом в кавычках, либо строковой переменной.

Замечание. Имена переменных в хранимых процедурах не должны предваряться символом ":" нигде, кроме как в командах SELECT, INSERT, UPDATE, DELETE, что позволяет отличать их от имен столбцов.

При выполнении процедуры команда POST_EVENT сообщает дис­петчеру событий о наступлении события. Диспетчер событий следит за приложениями, ждущими событий, и извещает об их наступлении.

post_event "Oh_oh_oh" ;

или

ABC = "Oh_oh_oh"; POST_EVENT ABC;

ОПЕРАТОРЫ SQL INSERT, UPDATE, SELECT, DELETE

Внутри хранимых процедур и триггеров могут использоваться стан­дартные команды SQL: INSERT, UPDATE, SELECT, DELETE. Единст­венной особенностью этих команд внутри процедур и триггеров является то, что в них могут использоваться в качестве параметров локальные пе­ременные процедур. Для того чтобы отличать локальные переменные от столбцов таблиц в командах INSERT, UPDATE, SELECT, DELETE, имена локальных переменных предваряются символом ":".

Кроме того, для помещения результатов выборки в локальные пере­менные к команде SELECT добавляется опция INTO : var [,: var ...].

ОПЕРАТОР ВОЗВРАТА ЗНАЧЕНИЙ ВЫХОДНЫХ ПАРАМЕТРОВ SUSPEND

Оператор SUSPEND предназначен для использования в хранимых процедурах (в триггерах SUSPEND неприменим), причем только в проце­дурах выбора, хотя синтаксически допустим и в выполнимых процедурах.

Оператор SUSPEND приостанавливает выполнение процедуры вы­бора, возвращает управление вызвавшей программе и возобновляет рабо­ту со следующей команды, когда выполнена очередная команда FETCH. SUSPEND возвращает вызвавшей программе результаты работы проце­дуры в выходных параметрах.

SUSPEND не должен использоваться в выполнимых процедурах, так как команды, следующие за ним, никогда не будут выполнены. В выпол­нимых процедурах следует использовать оператор явного выхода EXIT.

В процедуре выбора команда SUSPEND возвращает текущие значе­ния выходных параметров вызвавшей программе и продолжает выполне­ние. Если какой-либо выходной параметр не получил значение явно, то его содержимое непредсказуемо, что может привести к ошибкам, поэтому процедура должна обязательно присваивать значения всем выходным параметрам перед выполнением SUSPEND.

ОПЕРАТОР ПРЕРЫВАНИЯ ПРОЦЕДУРЫ EXIT

И в процедурах выбора и в выполнимых процедурах оператор EXIT передает управление на конец процедуры (завершающий END).

Действие, выполняемое по достижении конца процедуры, зависит от ее типа:

  • В процедуре выбора конечная команда END возвращает управле­ние вызвавшему ее приложению и устанавливает SQLCODE в 100; это указывает, что список найденных ею строк закончен.

  • В выполнимой процедуре конечная команда END возвращает управ­ление вызвавшему ее приложению с установкой значений выходных па­раметров, если они есть.

Сводка результатов выполнения операторов SUSPEND, EXIT и END приведена в таблице.

Тип процедуры

SUSPEND

EXIT

END

Процедура вы­бора

Приостанавливает работу до выполнения очередной команды FETCH и возвращает зна­чения выходных параметров

Переходит к завершающему процедуру опера­тору END

Возвращает управление вызвавшему ее приложению и устанавливает SQLCODE в 100 (конец потока)

Выполнимая процедура

Переходит к завершающему процедуру опера­тору END. He рекомендуется

Переходит к завершающему процедуру опера­тору END

Возвращает значения и передает управление вы­звавшему ее приложению

ОПЕРАТОР ОБРАБОТКИ ОШИБОК WHEN

Оператор WHEN ... DO обеспечивает обработку возникших ошибок. Оператор применяется в хранимых процедурах и триггерах.

Синтаксис:

WHEN {LIST_<error> / ANY} DO <compound_statement>

< error> :: {EXCEPTION errcode}

exception_name / SQLCODE number / GDSCODE

Оператор WHEN должен быть последним в блоке BEGIN...END. С его помощью процедуры и триггеры могут обрабатывать ошибки трех типов:

  • Исключения, инициированные оператором EXCEPTION в данной процедуре или процедурах, прямо или косвенно вызванных дан­ной, а также исключения, инициированные в триггерах, вызван­ных в результате действий этих процедур.

  • SQL-ошибки, идентифицирующиеся SQLCODE.

  • Ошибки, идентифицирующиеся кодами ошибок InterBase. Конструкция ANY позволяет выполнять операторы обработки при возникновении любых ошибок перечисленных типов.

Сводка синтаксиса оператора WHEN приведена в таблице.

Параметр

Описание

EXCEPTION exception_name

Имя исключения (описанного в базе)

SQLCODE number

Код ошибки – SQLCODE

GDSCODE errcode

Код ошибки InterBase

ANY

Обеспечивает вызов обработчика для любых перехватываемых ошибок

<compound_statement>

Простой оператор или блок, осуществляющий обработку ошибок