define('DISALLOW_FILE_EDIT', true); define('DISALLOW_FILE_MODS', true);Контроль ошибок во встроенном SQL

Контроль ошибок во встроенном 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, поскольку определяются такие действия глобально.


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




Статистика