Контроль ошибок во встроенном SQL


1) Особенности контроля ошибок
Во встроенном SQL за обработку ошибок отвечает прикладная программа. Для идентификации вида ошибки используют специальные переменные. SQL-операторы могут вызывать сообщения об ошибках двух типов.

2) Ошибки компиляции и выполнения
Ошибки компиляции
Подобные ошибки обнаруживаются препроцессором, программист получает соответствующее сообщение и может устранить ошибки и заново скомпилировать прикладную программу.
Ошибки выполнения
Ссылки на несуществующие столбцы, отсутствие разрешения на обновление таблицы и т.п. могут быть обнаружены только во время выполнения.

3) Переменная SQLCODE
СУБД сообщает прикладной программе об ошибках, возникающих во время выполнения, с помощью области связи SQLCA (SQL Communications Area). Область связи представляет собой структуру, состоящую примерно из 8-ми переменных, одной из которых является SQLCODE целочисленного типа.

4) Типовые значения SQLCODE

ЗначениеПояснение
0Выполнение было успешным
100Выполнения было успешным, но никаких данных не найдено.
• Например, оператор FETCH в курсоре уже установлен после последней строки результатов.
• Для операторов UPDATE И DELETE ни одна строки не удовлетворяет условию, указанному в предикате, и изменения не произошли.
>0 (≤100)Выполнение успешно, но есть предупреждение
<0Выполнение не было успешным

5) Пример работы с SQLCODE

main() {
exec sql include sqlca;
exec sql begin declare section;
float amount;
exec sql end declare section;

printf(“Количество товара?”);
scanf(“%f, &amount”);
exec sql delete from Orders where Amt < :amount; if (sqlca.sqlcode !=0) goto error_runtime; … error_runtime; printf(“Ошибка SQL: “, sqlca.sqlcode); exit(); }

6) Переменная SQLSTATE
Начиная с SQL-92 поддерживается и переменная SQLSTATE (с кодами ошибок, которые кодируются десятичными числами, представленными в текстовой форме).

Переменная SQLSTATE состоит из двух частей:
• Двухсимвольного класса ошибки, который дает общую классификацию ошибки. Первый символ может быть либо цифрой 1 4, либо буквой A H. Остальные цифры и буквы зарезервированы для нестандартных, присущих конкретным СУБД ошибок.
• Трехсимвольного подкласса ошибки, который определяет конкретный тип ошибки.

7) Оператор обработки ошибок
Синтаксическая форма — WHENEVER

{SQLERROR|SQLWARNING|NOT FOUND} {CONTINUE|GOTO <метка>}

Ключевые слова
— SQLERROR свидетельствует о наличии ошибок и позволяет перейти к подпрограмме обработки ошибок. Аналог – SQLCODE с отрицательными значениями.
— SQLWARNING свидетельствует о наличии предупреждений и позволяет перейти к подпрограмме обработки предупреждений. SQLCODE с положительными значениями (в стандарте отсутствует, но есть в большинстве СУБД).
— NOT FOUND свидетельствует об отсутствии данных и позволяет перейти к обработке конкретного предупреждения. Попытка извлечь данные, а их больше не осталось.
— <метка> отделяется от операторов точкой с запятой.

Пример использования

exec sql whenever sqlerror goto error1;
exec sql delete from Customer where City=”London”;

error1;
printf(“Ошибка оператора Delete: %d\n”, sqlca.sqlcode);
exit();

Многократно размещая предложения WHENEVER в тексте программы, можно изменять ее реакцию на значения SQLCODE, поскольку определяются такие действия глобально.


Комментарии запрещены.




Статистика