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

Обработка исключений

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

  • Прекращается выполнение блока BEGIN ... END, содержащего исключение, и отменяются действия, выполненные в блоке.

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

  • Выполняются действия, определенные оператором (блоком), за­данным в конструкции WHEN (если он обнаружен).

Управление возвращается оператору (блоку) программы, следующе­му за оператором WHEN.

Если исключение обработано с помощью WHEN, то соответствую­щее сообщение об ошибке не выдается.

Обработка ошибок sql

Процедуры могут также обрабатывать ошибки SQL по кодам, воз­вращенным в SQLCODE. После выполнения каждой команды SQL фор­мируется код ее завершения – SQLCODE, отражающий успешность вы­полнения, или код ошибки. SQLCODE может также содержать код пре­дупреждения, типа того, что перечень строк в выборке по циклу FOR SELECT исчерпан.

SQLCODE

Описание

0

Успешное завершение

1-99

Предупреждение или информационное сообщение

100

Конец файла (списка)

<0

Ошибка. Команда не выполнена

WHEN SQLCODE -803

/*Попытка добавить строку со значением первичного ключа,

которое уже есть в таблице */

DO

BEGIN

Обработка ошибок InterBase

Процедуры могут обрабатывать ошибки InterBase по кодам, возвра­щенным в GDSCODE. Например, если команда в процедуре пытается модифицировать строку, уже модифицированную другой, еще не завер­шенной, транзакцией, то в этом случае процедура могла бы получать код ошибки InterBase, isc_lock_conflict. При повторении попытки ее моди­фикации, другая транзакция может выполнить откат, сняв, таким образом, блокировку, что позволит успешно завершить команду. Используя инст­рукцию WHEN GDSCODE, процедура может обрабатывать ошибки кон­фликта блокировки и повторять его операцию.

В качестве примера рассмотрим фрагмент хранимой процедуры с воз­вращаемым параметром RETCODE, который устанавливается в 0 при нор­мальном выполнении процедуры и в 1 при возникновении каких либо ошибок.

BEGIN

RETCODE = 0;

WHEN ANY DO BEGIN RETCODE = 1;

EXIT; END END

Комментарий

Комментарий – произвольный текст, который может быть размещен в любом месте процедуры или триггера.

Синтаксис:

/* текст. */

Текст комментария может занимать несколько строк.

В следующей таблице дана краткая сводка операторов SQL для про­цедур и триггеров.

Команда

Описание

BEGIN... END

Операторные скобки, задающие составной опе­ратор (блок). BEGIN – ключевое слово, идентифицирующее начало блока; END – ключевое слово, иденти­фицирующее конец блока. Внутри блока может быть любое количество операторов. Ни после BEGIN, ни после END точка с запятой не ста­вится

variable = expression

Оператор присваивания. Задает новое значение (выражение expression) локальной, контекстной переменной или полю базы данных

/* comment_text */

Комментарий программиста. Комментарий мо­жет занимать несколько строк. На выполнение программы не влияет

EXCEPTION exception_name

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

EXECUTE PROCEDURE proc_name [LIST_var]

[returning_values LIST_var]

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

FOR <select_statement> DO <compound_statement>

Задает цикл выполнения оператора или блока (группы операторов в операторных скобках BEGIN-END) для всех строк получаемых по запросу, определенному конструкцией <select_statement>. <select_statement> – обычная команда SELECT, за исключением обязательной здесь опции INTO. Поле INTO указывает список локальных пере­менных, в которые помещаются данные из оче­редной выбранной по запросу строки

<compound_statement>

Простой оператор или блок (группа операторов в операторных скобках BEGIN-END)

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

Проверяет условие <condition> и в зависимости от его истинности выполняет либо оператор (блок), следующий за ключевым словом THEN в случае истинности условия, либо оператор (блок), следующий за ключевым словом ELSE в случае ложности условия. Конструкция ELSE является необязательной

NEW.column

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

OLD.column

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

POST_EVENT event_name

Инициирует событие event_name

WHILE (<condition>) DO <compound_statement>

Задает цикл выполнения оператора или блока (группы операторов в операторных скобках BEGIN-END) <compound_statement> до тех пор, пока истинно условие <condition>. Если условие изначально ложно, то цикл не выполняется ни разу

WHEN {LIST_<error>]|Any} DO <compound_statement>

Оператор обработки сообщений об ошибках. Если происходит одно из списка событий <error>, то выполняется оператор (блок) <compound_statement>. Если необходимо использовать оператор WHEN, то он должен быть помещен в конце блока, непосредственно перед операторной скобкой END. Конструкция <еггог> имеет следующий вид: EXCEPTION exception_name, где ехсер-tion_name – имя исключения; SQLCODE errcode, где errcode код ошибки SQL; GDSCODE number, где number номер ошибки InterBase; ANY – любые исключения или ошибки

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