Программирование >>  Sql: полное руководство 

1 ... 135 136 137 [ 138 ] 139 140 141 ... 264


Обратите внимание на то, что первой встроенной инструкцией на рис. 17.4, 17.5, 17.6 и 17.7 является инструкция include sqlca. Она указывает препроцессору SQL, цтобы тот включил в данную программу область связей SQL. В разных СУБД конкретное содержимое области связей слегка различается, но она всегда содержит информацию одного и того же типа. На рис. 17.9 описана структура sqlca, используемая в СУБД компании IBM. Наиболее важная часть области связей SQL - переменная sqlcode - поддерживается всеми СУБД, использующими встроенный SQL, определена в стандарте ANSI/ISO.

struct sqlca (

unsigned char sqlcaid[81; /* строка SQLCA */

long sqlcabc; /* длина области в байтах */

long sqlcode; /* SQL-код состояния */

short sqlerrml; /* длина массива sqlerrmc */

unsigned char sqlerrmc[70]; /* имена объектов, вызвавших ошибку

unsigned char sqlerrp[81 long sqlerrdf6]

unsigned char sqlwarn[

/* диагностическая информация */ /* различные счетчики и коды ошибок /* массив флагов предупреждения */

unsigned char sqlext[8]; /* расширения массива sqlwarn */

tdefme SQLCODF sqlca. sqlcode /* SQL-код состояния */

/* Символ W в любом из полей массива sqlwarn служит признаком предупреждения;

в противном случае эти поля являются пустыми */

tdefine SQLWARNO sqlca.sqlwarn[О] /* основной флаг предупреждения */

tdefine SQLWARN1 sqlca.sqlwarn[1] /* строка уоечена */

tdefine SQLWARN2 sqlca.sqlwarn[2] /* значения NULL удалены из статистической функции

Idefme SQLWARN3 sqlca. sqlwarn [ 3] /* слишком мало/много переменных базового языка */

tdefine SQLWARN4 sqlca.sqlwarn[4] /* подготовлена инструкция UPDATE/DELETE

без предложения WHERE */

tdefine SQLWARN5 sqlca.sqlwarn[5] /* несовместимост между SQL/DS и DB2 */

tdefine SQLWARN6 sqlca.Sqlwarn[б] /* неправильная дата в арифметическом выражении */

tdefne SQLWARN? sqlca sqlwarn[7] /* зарезервировано */

Рис. 17.9. Область связей SQL (SQLCA) для баз данных компании IBM

При выполнении каждой встроенной инструкции SQL СУБД присваивает значение переменной sqlcode в области связей SQL, показывающее, как завершилось выполнение инструкции:

Нулевое значение переменной sqlcode указывает на успещное выполнение инструкции без каких-либо ошибок или предупреждений.

Отрицательное значение переменной sqlcode указывает на серьезную ошибку, которая не позволила правильно вьшолнить инструкцию. Например, попытка модифицировать представление, доступное только для чтения, приведет к присвоению отрицательного значения переменной sqlcode. Каждой ошибке, которая может возникнуть ю время выполнения, соответствует отдельное отрицательное значение этой переменной.

Положительное значение переменной sqlcode указывает на ненормальную ситуацию, о которой пользователь должен быть предупрежден. Например, усечение или округление значения элемента данных, полученного программой, вызывает появление предупреждения. Каждому предупреждению, которое может возникнуть во время выполнения, соответствует отдельное положительное значение переменной sqlcode. Одно из наиболее распространенных предупреждений, имеющее код 100, означает нет данных ; оно генерируется в ситуации, когда программа пытается получить следующую строку результатов запроса, хотя предыдущая строка была последней.



Так как любая выполняемая инструкция встроенного SQL потенциально может вызвать ошибку, правильно написанная программа будет проверять значение переменной sqlcode после каждой такой инструкции. На рис. 17 10 приведен фрагмент программы, написанной на С, в котором проверяется значение переменной sqlcode На рис. 17.11 представлен аналогичный фрагмент программы на языке COBOL.

exec sql delete from salesreps where quota < 150000; if (sqlca.sqlcode < 0) goto error routine;

error routine:

printf{ Ошибка SQL: %ld\n , sqlca.sqlcode); exit (1);

Рис. ПЛОЪтрывок np

же С с проверкой переменной SQLCODE

01 PRINT-MESSAGE.

02 FILLER PIC Х{11) VALUE Ошибка SQL:

02 PRINT-CODE PIC SZ{9).

EXEC SQL DELETE FROM SALESREPS WHERE QUOTA < 150000

END-EXEC.

IF SQLCODE NOT = ZERO GOTO ERROR-ROUTINE.

ERROR-ROUTINE.

MOVE SQLCODE TO PRINT-CODE. DISPLAY PRINT-MESSAGE.

fnc. 17. IJ. Отрывок программы на языке COBOL с проверкой переменной SQLCODE

Переменная SQLSTATE

К тому времени, когда появился стандарт SQL2, практически во всех коммерческих реляционных СУБД для сообщения об ошибках в программах со встроенным SQL использовалась переменная sqlcode. Однако номера ошибок не были стандартизированы, и в разных СУБД одним и тем же ошибкам соответствовали различные номера. Кроме того, в связи с тем что стандарт SQL1 допускал значительные различия



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

Понимая, что невозможно привести к единому стандарту значения переменной sqlcode в разных СУБД, разработчики стандарта SQL2 избрали другой путь. Они включили в стандарт переменную sqlcode, но обозначили ее как нежелательную , имея в виду, что она устарела и в скором времени будет исключена из стандарта. Вместо нее они ввели новую переменную sqlstate. В стандарте подробно определены ошибки, о которых можно сообщать с помощью переменной sqlstate, и каждой ощибке присвоен код. Чтобы соответствовать стандарту SQL2, СУБД должна сообщать об ошибке как с помощью переменной sqlcode, так и с помощью переменной sqlstate. Таким образом, программы, использующие переменную sqlcode, могут по-прежнему функционировать, а новые программы можно писать, используя стандартные коды ошибок переменной sqlstate.

Переменная sqlstate состоит из двух частей:

ш Двухсимвольный класс ошибки, который дает общую классификацию ощибки (например, ошибка соединения , недействительные данные или предупреждение ).

Трехсимвольный подкласс ошибки, который определяет конкретный тип ошибки. Например, в классе недействительные данные могут быть такие подклассы ошибок: деление на ноль , недействительное числовое значение или недействительные дата/время .

Первый символ класса ошибки, согласно стандарту SQL2, может быть цифрой от нуля до четырех (включительно) или буквой от А до Н (включительно). Например, ошибки данных относятся к классу 22, а отмена транзакции - к классу 40. Нарушение целостности данных (например, внешнего ключа) относится к классу 23. Стандартные коды подклассов ошибок также подчиняются указанным соглашениям. В частности, в классе ошибок с номером 40 существуют подклассы 001 - ошибка сериализации (означает, что программа объявлена проигравшей в тупиковой ситуации), 002 - нарушение целостности и 003 - статус завершента инструкции SQL не определен (например, произошел разрыв сетевого соединения или сбой сервера до завершения инструкции). На рис. 17.12 представлен текст той же программы на языке С, что и на рис. 17.10, но в этот раз для проверки ошибок применяется переменная sqlstate, а не sqlcode.

exec sql delete from salesreps

where quota < 150000;

If (strcmp(sqlca.sqlstate, 00000 ))

goto error routine;

error routine:

printf( Ошибка SQL. %s\n , sqlca.sqlstate);

exit(l) ,

г&ремвнной SQLSTATE



1 ... 135 136 137 [ 138 ] 139 140 141 ... 264

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика