Страница 15 из 25
2. 5. 2 Встроенный 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. |