Классика баз данных - статьи

       

Встроенный SQL


Поскольку в стандарте SQL/89 не специфицированы (даже в приложениях)правила встраивания SQL в язык Си, мы приведем только общие синтаксические правила встраивания, используемые для любого языка. Это поможет оценить "уровень стандартности" конкретной реализации.

<embedded SQL statement> ::=< SQL prefix>{ <declare cursor>| <embedded exception declaration>| < SQL statement>}[< SQL terminator>]< SQL prefix> ::=EXEC SQL< SQL terminator> ::=END EXEC | ;<embedded SQL declare section> ::=<embedded SQL begin declare>[<host variable definition>. . . ]<embedded SQL end declare><embedded SQL begin declare> ::=< SQL prefix> BEGIN DECLARE SECTION[< SQL terminator>]<embedded SQL end declare> ::=< SQL prefix> END DECLARE SECTION[< SQL terminator>]<embedded variable name> ::=:<host identifier><embedded exception declaration> ::=WHENEVER <condition> <exception action><condition> ::= SQLERROR | NOT FOUND<exception action> ::=CONTINUE | <go to><go to> ::={ GOTO | GO TO } <target><target> ::= :<host identifier> | <unsigned integer>

Встраиваемые операторы SQL, включая объявления курсора, а также разделы объявления исключительных ситуаций и переменных основной программы, должны быть окружены скобками EXEC SQL и END EXEC. Объявление курсора должно встречаться текстуально раньше любого оператора, ссылающегося на этот курсор. Все переменные основной программы, используемые во встроенных операторах SQL, должны быть объявлены в текстуально предшествующем этому оператору разделе объявления переменных основной программы. При этом синтаксис объявления переменной соответствует синтаксису основного языка программирования, но имени переменной предшествует двоеточие.

Механизм обработки исключительных ситуаций в SQL/89 крайне прост (можно сказать, примитивен). Можно задавать реакцию на возникновение двух видов условий: SQLERROR - это условие появления отрицательного значения в переменной SQLCODE после выполнения встроенного оператора; NOT FOUND - условие появления в SQLCODE значения +100 (этот код означает исчерпание результирующего множества запроса при его просмотре через курсор). Реакция может состоять в выполнении безусловного перехода на метку основной программы (действие GO TO) или отсутствовать (действие CONTINUE). Срабатывает тот оператор определения реакции на исключительную ситуацию, который текстуально ближе от начала программы к данному оператору SQL.

Заметим, что во многих реализациях поддерживается два вида кодов ответа при выполнении операторов SQL (встроенных или взятых из модуля): через переменную SQLCODE с кодами ответа, представляемыми целыми числами, и через переменную SQLSTATE с кодами ответа, которые кодируются десятичными числами, представленными в текстовой форме. Имеется тенденция к переходу на использование только механизма SQLSTATE, но в стандартных реализациях должен поддерживаться и механизм SQLCODE.



Содержание раздела