Стандарты языка реляционных баз данных SQL



       

Встроенный 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.



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