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