Синтаксис языка SPL

Составитель: В. Кравчук, Copyright (C) 1999


ВСЕ В ЭТОЙ КНИГЕ МОЖЕТ ОКАЗАТЬСЯ ОШИБКОЙ.
Ричард Бах, "Иллюзии"

Содержание


Расширенные формулы Бэкуса-Наура

При описании синтаксиса языка SPL использованы расширенные формулы Бэкуса-Наура (БНФ). Приведем сначала контекстно-свободную грамматику, порождающую язык этих формул (символ --> является метасимволом, отделяющим левую часть правила грамматики от правой, терминальные символы выделены моноширинным шрифтом, а нетерминальные - наклонным и взяты в угловые скобки):

<формула> -->
<нетерминал> ::= <сложная цепочка>
<нетерминал> -->
<;нетерминал><нетерминальный символ>
<нетерминал> -->
<нетерминальный символ>
<сложная цепочка> -->
<сложная цепочка> | <элемент>
<сложная цепочка> -->
<элемент>
<элемент> -->
<простая цепочка>
<элемент> -->
<расширение>
<расширение> -->
[ <сложная цепочка> ]
<расширение> -->
{ <сложная цепочка> }
<простая цепочка> -->
*
<простая цепочка> -->
<простая цепочка><нетерминал>
<простая цепочка> -->
<простая цепочка><терминал>
<простая цепочка> -->
<простая цепочка><расширение>
<терминал> -->
<терминал><терминальный символ>
<терминал> -->
<терминальный символ>

При этом <терминальный символ> принадлежит конечному множеству терминальных символов описываемого языка, а <нетерминальный символ> принадлежит множеству нетерминальных символов описываемого языка. Это может быть выражено добавлением соответствующего количества правил по одному на каждый возможный символ. Символ * используется как метасимвол для обозначения пустой цепочки. Метасимвол | обозначает, что данная формула является сокращенной записью нескольких формул с одинаковыми левыми частями и различными цепочками в правой части (т. е. возможен один из разделенных этим символом вариантов). Пара метасимволов [ ] используется для обозначения того, что находящаяся между ними цепочка может содержаться, а может и не содержаться в правой части формулы. Пара { } означает, что содержащаяся между ними цепочка может повторяться ноль или более раз.

Язык таких расширенных формул Бэкуса-Наура позволяет более кратко и понятно для человека задавать грамматику определяемого языка. Можно легко доказать (путем описания алгоритма построения), что по любой грамматике, заданной с использованием этих формул, можно построить соответствующую ей контекстно-свободную грамматику, порождающую тот же язык. Очевидно, имеет место и обратное утверждение (предложенная грамматика содержит язык контекстно-свободных грамматик с точностью до замены метасимволов --> и ::=). Таким образом, расширенные БНФ являются просто способом сокращенной записи контекстно-свободных грамматик.

Примечание

Обратите внимание, что в документации Informix, используются синтаксические диаграммы. Выбранный нами вариант расширенных БНФ проще для набора и чаще используется в общедоступной литературе (см. например [Вирт], [Джехани]).

Синтаксические формулы сгруппированы по разделам. Порядок следования разделов соответствует порядку описания соответствующих языковых конструкций в данном документе.

Примечание

Нетерминальные символы SPL (определяемые понятия, конструкции и операторы языка) взяты в угловые скобки и выделены наклонным шрифтом. Терминальные символывыделены моноширинным шрифтом.

Некоторые нетерминальные символы (например, <буква>) не раскрываются до терминальных. Мы опишем их неформально, если возможные значения не очевидны.


Базовые конструкции

Идентификаторы

<идентификатор> ::=
<первый символ>{<следующий символ}
| <идентификатор в кавычках>
<первый символ> ::=
<буква>
| <подчеркивание>
<следующий символ> ::=
<буква>
| <цифра>
| <подчеркивание>
<идентификатор в кавычках> ::=
"<произвольный символ> {<произвольный символ>}"

Имена баз данных

<имя базы данных> ::=
<локальное имя базы данных>[@<имя сервера>]
| '//<имя сервера>/<локальное имя базы данных>'
| <имя переменной>
| '//<имя сервера>/<путь>/<локальное имя базы данных>'
| '/<путь>/<локальное имя базы данных>@<имя сервера>'
<локальное имя базы данных> ::=
<идентификатор>
<имя сервера> ::=
<идентификатор>

Имена сущностей базы данных

<имя переменной> ::=
<идентификатор>
<имя столбца> ::=
<идентификатор>
<имя синонима> ::=
[<имя базы данных>:][<владелец>.]<идентификатор>
<имя таблицы> ::=
[<имя базы данных>:][<владелец>.]<идентификатор>
<имя представления> ::=
[<имя базы данных>:][<владелец>.]<идентификатор>
<имя триггера> ::=
[<имя базы данных>:][<владелец>.]<идентификатор>
<имя процедуры> ::=
[<имя базы данных>:] [<владелец>.]<идентификатор>
<владелец> ::=
<имя владельца>
| '<имя владельца>'

Литералы

Числовые литералы

<числовой литерал> ::=
[<знак>] <цифра>{<цифра>} [.{<цифра>}][<степень>]
|[<знак>] .<цифра>{<цифра>}[<степень>]
<степень> ::=
E[<знак>]<цифра>{<цифра>}
<знак> ::=
- | +
<целочисленный литерал> ::=
[<знак>] <цифра>{<цифра>}

Строки в кавычках (строковые литералы)

<строка в кавычках> ::=
'{<символ или одиночные кавычки>}'
| "{<символ или двойные кавычки>}"
<символ или одиночные кавычки> ::=
<символ> | ''
<символ или двойные кавычки> ::=
<символ> | ""

Интервальные литералы

<интервальный литерал> ::=
INTERVAL (<числовая дата>) <уточнение поля INTERVAL>
<числовая дата> ::=
<гггг>[-<мм>]
| <мм>
| <дд>[<пробел><время>]
| <время>
<гггг> ::=
<числовой литерал>
<мм> ::=
<числовой литерал>
<дд> ::=
<числовой литерал>
<время> ::=
<чч>[:<минуты-доли секунды>]
<минуты-доли секунды> ::=
<минуты>[:<секунды-доли секунды>]
<секунды-доли секунды> ::=
<секунды>[.<доли секунды>]
<чч> ::=
<числовой литерал>
<минуты> ::=
<числовой литерал>
<секунды> ::=
<числовой литерал>
<доли секунды> ::=
<числовой литерал>
<уточнение поля INTERVAL> ::=
YEAR [(<точность года>)] TO YEAR
| YEAR [(<точность года>)] TO MONTH
| MONTH [(<точность>)] TO MONTH
| DAY [(<точность>)] <до дня-долей секунды>
| HOUR [(<точность>)] <до часа-долей секунды>
| MINUTE [(<точность>)] <до минуты-долей секунды>
| SECOND [(<точность>)] <до секунды-долей секунды>
| FRACTION <до долей секунды>
<точность года> ::=
<числовой литерал>
<точность> ::=
<числовой литерал>
<до дня-долей секунды> ::=
TO DAY | <до часа-долей секунды>
<до часа-долей секунды> ::=
TO HOUR | <до минуты-долей секунды>
<до минуты-долей секунды> ::=
TO MINUTE | <до секунды-долей секунды>
<до секунды-долей секунды> ::=
TO SECOND | <до долей секунды>
<до долей секунды> ::=
TO FRACTION [(<точность долей секунды>)]
<точность долей секунды> ::=
<числовой литерал>

Литералы типа даты и времени

<литерал типа даты и времени> ::=
DATETIME (<числовая дата>) <уточнение полей даты и времени>
<уточнение полей даты и времени> ::=
YEAR <до года-долей секунды>
| MONTH <до месяца-долей секунды>
| DAY <до дня-долей секунды>
| HOUR <до часа-долей секунды>
| MINUTE <до минуты-долей секунды>
| SECOND <до секунды-долей секунды>
| FRACTION <до долей секунды>
<до года-долей секунды> ::=
TO YEAR | <до месяца-долей секунды>
<до месяца-долей секунды> ::=
TO MONTH | <до дня-долей секунды>

Блоки и операторы

<блок операторов> ::=
{<оператор определения переменных>}
{<оператор обработки исключительных ситуаций>}
{<оператор SPL>}
<оператор SPL> ::=
<оператор вызова процедуры>>
| <оператор продолжения цикла>
| <оператор выполнения процедуры>
| <оператор окончания цикла>
| <оператор цикла FOR>
| <оператор цикла FOREACH>
| <условный оператор>
| <оператор присваивания>
| <оператор возбуждения исключительной ситуации>
| <оператор возврата>
| <оператор системного вызова>
| <оператор трассировки>
| <оператор установки файла отладочной информации>
| <оператор цикла WHILE>
| <подмножество SQL-операторов> ;
| BEGIN <блок операторов> END

Выражения

<выражение> ::=
[<знак>] <элемент выражения>
{<оператор> [<знак>]<элемент выражения>}
<элемент выражения> ::=
<столбец>
| <константа>
| <встроенная функция>
| <выражение агрегирования>
| <вызов процедуры>
| <имя переменной>
| <имя переменной процедуры>
| (<выражение>)
<оператор> ::=
+ | - | * | / | ||
<имя переменной> ::=
<идентификатор>
<имя переменной процедуры> ::=
<идентификатор>

Столбцы

<столбец> ::=
<уточнение имени столбца><имя столбца>[ [<первый> , <последний>] ]
| <уточнение имени столбца>ROWID
<уточнение имени столбца> ::=
<имя таблицы>.
| <имя представления>.
| <имя синонима>.
| <псевдоним>.
<первый> ::=
<числовой литерал>
<последний> ::=
<числовой литерал>

Константы

<константа> ::=
<числовой литерал>
| <строка в кавычках>
| <интервальный литерал>
| <литерал типа даты и времени>
| CURRENT [<уточнение полей даты и времени>]
| USER
| TODAY
| DBSERVERNAME
| SITENAME
| <числовой литерал> UNITS <единица даты или времени>
<единица даты или времени> ::=
YEAR | MONTH | DAY | HOUR
| MINUTE | SECOND | FRACTION [<цифра>]

Встроенные функции

<встроенная функция> ::=
<алгебраическая функция>
| <функция DBINFO>
| <экспоненциальная или логарифмическая функция>
| <функция HEX>
| <функция LENGTH>
| <функция над временем>
| <тригонометрическая функция>
| <функция TRIM>

Алгебраические функции

<алгебраическая функция> ::=
ABS (<числовое выражение>)
| MOD (<делимое>, <делитель>)
| POW (<основание>, <показатель степени>)
| ROOT (<подкоренное выражение> [, <показатель степени>])
| ROUND (<выражение> [, <порядок>])
| SQRT (<подкоренное выражение>)
| TRUNC (<выражение> [, <порядок>])
<делимое> ::=
<числовое выражение>
<делитель> ::=
<числовое выражение>
<основание> ::=
<числовое выражение>
<показатель степени> ::=
<числовое выражение>
<подкоренное выражение> ::=
<числовое выражение>
<порядок> ::=
<целочисленное выражение>

Функция DBINFO

<функция DBINFO> ::=
DBINFO (<указатель информации>)
<указатель информации> ::=
'DBSPACE' <указатель табличного пространства>
| 'sqlca.sqlerrd1'
| 'sqlca.sqlerrd2'
<указатель табличного пространства> ::=
<числовое выражение>

Экспоненциальные и логарифмические функции

<экспоненциальная или логарифмическая функция> ::=
EXP (<числовое выражение>)
| LOGN (<числовое выражение>)
| LOG10 (<числовое выражение>)

Функция HEX

<функция HEX> ::=
HEX (<целочисленное выражение>)

Функция LENGTH

<функция LENGTH> ::=
LENGTH (<аргумент LENGTH>)
<аргумент LENGTH> ::=
<строка в кавычках>
| <имя переменной>
| [<уточнение имени столбца>]<имя столбца>

Функции над временем

<функция над временем> ::=
DATE (<выражение типа не-DATE>)
| <элемент даты> (<выражение типа даты и времени>)
| EXTEND (<выражение типа даты и времени>
 [, <уточнение полей даты и времени>])
| MDY (<месяц>, <день>, <год>)
<элемент даты> ::=
DAY | MONTH | WEEKDAY | YEAR
<месяц> ::=
<целочисленное выражение>
<день> ::=
<целочисленное выражение>
<год> ::=
<целочисленное выражение>

Тригонометрические функции

<тригонометрическая функция> ::=
<прямая тригонометрическая функция> (<числовое выражение>)
| <обратная тригонометрическая функция> (<числовое выражение>)
| ATAN2 (<числовое выражение>, <числовое выражение>)
<прямая тригонометрическая функция> ::=
SIN | COS | TAN
<обратная тригонометрическая функция> ::=
ASIN | ACOS | ATAN

Функция TRIM

<функция TRIM> ::=
TRIM ([[<уточнение позиции>]<односимвольное выражение> FROM]  <символьное выражение>)
<уточнение позиции> ::=
LEADING | TRAILING | BOTH

Выражения агрегирования

<выражение агрегирования> ::=
COUNT(*)
| COUNT (<уточнение строк>
 [<уточнение имени столбца>]<имя столбца>)
| <функция агрегирования> ([<уточнение строк>]
 [<уточнение имени столбца>]<имя столбца>)
| <функция агрегирования> ([ALL] <выражение (подмножество)>)
<уточнение строк> ::=
DISTINCT | UNIQUE
<функция агрегирования> ::=
AVG | MAX | MIN | SUM

Вызовы процедур

<вызов процедуры> ::=
<имя процедуры> ( [<список аргументов>] )
<список аргументов> ::=
<аргумент> {, <аргумент>}
<аргумент> ::=
[<имя параметра> = ] <значение аргумента>
<имяпараметра> ::=
<идентификатор>
<значение аргумента> ::=
<выражение>
| <ограниченный оператор SELECT>

Оператор вызова процедуры (CALL)

<оператор вызова процедуры> ::=
CALL <имя процедуры> ( [<список аргументов>] )
[RETURNING <список переменных процедуры>] ;
<список переменных процедуры> ::=
<переменная процедуры>{, <переменная процедуры>}
<переменная процедуры> ::=
<идентификатор>

Оператор выбора (CASE)

<оператор выбора> ::=
CASE <выражение> <вариант> {<вариант>} [<вариант по умолчанию>] END CASE | <вариант по умолчанию> END CASE
<вариант> ::=
WHEN <константное выражение> THEN <блок операторов>
<вариант по умолчанию> ::=
ELSE <блок операторов>

Примечание

Константное выражение -- это выражение, элементами которого являются константы.


Оператор продолжения цикла (CONTINUE)

<оператор продолжения цикла> ::=
CONTINUE <имя оператора цикла> ;
<имя оператора цикла> ::=
FOR | WHILE | FOREACH

Оператор определения переменных (DEFINE)

<оператор определения переменных> ::=
DEFINE <определение глобальных переменных> ;
| DEFINE <определение переменных> ;
<определение глобальных переменных> ::=
GLOBAL <список имен переменных> <тип и значение по умолчанию>
<список имен переменных> ::=
<имя переменной> {, <имя переменной>}
<тип и значение по умолчанию> ::=
<тип данных SQL (подмножество)> DEFAULT <значение по умолчанию>
| REFERENCES <ссылочный тип> DEFAULT NULL
<ссылочный тип> ::=
BYTE | TEXT
<определение переменных> ::=
<список имен переменных> <тип>
<тип> ::=
<тип данных SQL (подмножество)>
| REFERENCES <ссылочный тип>
| LIKE <ссылка на таблицу или представление>.<имя столбца>
| PROCEDURE
<ссылка на таблицу или представление> ::=
<имя таблицы>
| <имя синонима>
| <имя представления>

Значения по умолчанию

<значение по умолчанию> ::=
<числовой литерал>
| <строка в кавычках>
| <интервальный литерал>
| <литерал типа даты и времени>
| CURRENT [<уточнение полей даты и времени>]
| USER
| TODAY
| NULL
| DBSERVERNAME
| SITENAME

Оператор окончания цикла (EXIT)

<оператор окончания цикла> ::=
EXIT <имя оператора цикла> ;

Оператор выполнения процедуры (EXECUTE PROCEDURE)

<оператор выполнения процедуры> ::=
EXECUTE PROCEDURE <имя процедуры> ([ <список аргументов> ])
[INTO <хост-переменная>{, <хост-переменная>}]

Оператор цикла FOR

<оператор цикла FOR> ::=
FOR <имя переменной> <определение значений переменной>
<блок операторов>
END FOR [;]
<определение значений переменной> ::=
IN ( <группа значений> {, <группа значений>} )
| = <диапазон и шаг>
<группа значений> ::=
<диапазон и шаг>
| <выражение> {, <выражение>}
<диапазон и шаг> ::=
<левое выражение> TO <правое выражение>
[ STEP <выражение приращения> ]
<левое выражение> ::=
<целочисленное выражение>
<правое выражение> ::=
<целочисленное выражение>
<выражение приращения> ::=
<целочисленное выражение>

Оператор цикла FOREACH

<оператор цикла FOREACH> ::=
FOREACH <источник строк> <блок операторов>
END FOREACH [;]
<источник строк> ::=
[<спецификации>] <оператор SELECT INTO>
| EXECUTE PROCEDURE <имя процедуры> ([<список аргументов>])
[INTO <список имен переменных>]
<спецификации> ::=
WITH HOLD
| <имя курсора> [WITH HOLD] FOR
<имя курсора> ::=
<идентификатор>

Условный оператор (IF)

<условный оператор> ::=
IF <условие> THEN {<оператор SPL>}
<проверка других условий>
[ELSE <оператор SPL>{<оператор SPL>}] END IF [;]
<проверка других условий> ::=
{ELIF <условие> THEN <оператор SPL> {<оператор SPL>}}
<условие> ::=
<элемент условия> {<логическая связка> <элемент условия>}
<элемент условия> ::=
[NOT] <сравнение>
| [NOT] <условие с подзапросом>

Сравнения

<сравнение> ::=
<выражение> <оператор отношения> <выражение>
| <выражение> [NOT] BETWEEN <выражение> AND <выражение>
| <выражение> [NOT] IN (<значение>{,<значение>})
| [<уточнение имени столбца>]<имя столбца> IS [NOT] NULL
| [<уточнение имени столбца>]<имя столбца> [NOT] LIKE
 <строка в кавычках> [ESCAPE '<символ>']
| [<уточнение имени столбца>]<имя столбца> [NOT] MATCHES
 <строка в кавычках> [ESCAPE '<символ>']
<оператор отношения> ::=
< | <= | > | >= | <> | !=
<значение> ::=
<числовой литерал>
| <строка в кавычках>
| <интервальный литерал>
| <литерал типа даты и времени>
| CURRENT [<уточнение полей даты и времени>]
| USER
| TODAY
| DBSERVERNAME
| SITENAME
<логическая связка> ::=
AND | OR

Подзапросы в условиях

<условие с подзапросом> ::=
<подзапрос IN>
| <подзапрос EXISTS>
| <подзапрос ALL/ANY/SOME>
<подзапрос IN> ::=
<выражение> [NOT] IN (<подзапрос>)
<подзапрос EXISTS> ::=
[NOT] EXISTS (<подзапрос>)
<подзапрос ALL/ANY/SOME> ::=
<выражение> <оператор отношения> [<тип подзапроса>] (<подзапрос>)
<тип подзапроса> ::=
ALL | ANY | SOME

Оператор присваивания (LET)

<оператор присваивания> ::=
LET <имя переменной> {, <имя переменной>} =
<источник значений> {, <источник значений>} ;
<источник значений> ::=
<имя процедуры> ( [<список аргументов>] )
| <выражение> {, <выражение>}
| ( <оператор SELECT> )

Оператор обработки исключительных ситуаций (ON EXCEPTION)

<оператор обработки исключительных ситуаций> ::=
ON EXCEPTION
[IN (<номер ошибки> {, <номер ошибки>})]
[<установка кодов ошибок>] <блок операторов>
END EXCEPTION [WITH RESUME] [;]
<номер ошибки> ::=
<целочисленный литерал>
<установка кодов ошибок> ::=
SET <переменная ошибки SQL>
[, <переменная ошибки ISAM>
[, <переменная сообщения об ошибке>]]
<переменная ошибки SQL> ::=
<имя переменной>
<переменная ошибки ISAM> ::=
<имя переменной>
<переменная сообщения об ошибке> ::=
<имя переменной>

Оператор возбуждения исключительной ситуации (RAISE EXCEPTION)

<оператор возбуждения исключительной ситуации> ::=
RAISE EXCEPTION <ошибка SQL>
[, <ошибка ISAM> [, <переменная сообщения об ошибке>]] ;
<ошибка SQL> ::=
<целочисленное выражение>
<ошибка ISAM> ::=
<целочисленное выражение>

Оператор возврата (RETURN)

<оператор возврата> ::=
RETURN [<выражение> {,<выражение>} [WITH RESUME]] ;

Оператор системного вызова (SYSTEM)

<оператор системного вызова> ::=
SYSTEM <выражение> ;

Оператор трассировки (TRACE)

<оператор трассировки> ::=
TRACE <команда трассировки> ;
| TRACE <выражение> ;
<команда трассировки> ::=
ON | OFF | PROCEDURE

Установка файла отладочной информации

<оператор установки файла отладочной информации> ::=
SET DEBUG FILE TO <ссылка на файл> [WITH APPEND]
<ссылка на файл> ::=
'<имя файла>'
| <имя переменной>
| <символьное выражение>

Оператор цикла WHILE

<оператор цикла WHILE> ::=
WHILE <условие> <блок операторов> END WHILE [;]

Основные операторы SQL

Операторы SELECT и SELECT INTO

<оператор SELECT> ::=
<элемент объединения> {<оператор объединения> <элемент объединения>}
| <ядро оператора SELECT> [<конструкция HAVING>]
 FOR UPDATE
| <ядро оператора SELECT> [<конструкция группировки>]
 [<конструкция упорядочивания>] [<конструкция INTO TEMP>]
<элемент объединения> ::=
<ядро оператора SELECT> [<конструкция HAVING>]
 [<конструкция группировки>]
| <ядро оператора SELECT> [<конструкция группировки>]
 [<конструкция HAVING>]
<оператор объединения> ::=
UNION | UNION ALL
<ядро оператора SELECT> ::=
SELECT [<уточнение>] <список выбора> [<конструкция INTO>]
<конструкция FROM>
[<конструкция WHERE>]
<уточнение> ::=
ALL | DISTINCT | UNIQUE

Список выбора

<список выбора> ::=
<элемент списка выбора> {, <элемент списка выбора>}
| *
<элемент списка выбора> ::=
<выражение> [[AS] <псевдоним>]
| [<уточнение имени столбца>]*
<псевдоним> ::=
<идентификатор>

Конструкция INTO

<конструкция INTO> ::=
INTO <целевая структура> {, <целевая структура>}
<целевая структура> ::=
<переменная данных>[<индикатор>]
| <структура данных>
<переменная данных> ::=
<имя переменной> | <хост-переменная>
<индикатор> ::=
:<индикаторная переменная>
| $<индикаторная переменная>
| INDICATOR <индикаторная переменная>

Конструкция FROM

<конструкция FROM> ::=
FROM <ссылка на источник> [, <дополнительные источники>]
<ссылка на источник> ::=
<источник> [[AS] <псевдоним>]
<источник> ::=
<имя таблицы>
| <имя представления>
| <имя синонима>
<дополнительные источники> ::=
<дополнительный источник> {, <дополнительный источник>}
<дополнительный источник> ::=
<ссылка на источник>
| OUTER <ссылка на источник>
| OUTER (<ссылка на источник>[, <дополнительные источники>])

Конструкция WHERE

<конструкция WHERE> ::=
WHERE <элемент условия WHERE> {AND <элемент условия WHERE>}
<элемент условия WHERE> ::=
<условие>
| <соединение>
<соединение> ::=
[<уточнение имени столбца>]<имя столбца>
<оператор отношения>
[<уточнение имени столбца>]<имя столбца>

Конструкция HAVING

<конструкция HAVING> ::=
HAVING <условие>

Конструкция группировки

<конструкция группировки> ::=
GROUP BY <ссылка на столбец> {, <ссылка на столбец>}
<ссылка на столбец> ::=
[<уточнение имени столбца>]<имя столбца>
| <номер столбца>
<номер столбца> ::=
<целочисленный литерал>

Конструкция упорядочивания

<конструкция упорядочивания> ::=
ORDER BY <ссылка на столбец упорядочивания> [<критерий>]
{, <ссылка на столбец упорядочивания> [<критерий>]}
<ссылка на столбец упорядочивания> ::=
<ссылка на столбец>
| <псевдоним столбца>
| ROWID
<критерий> ::=
ASC | DESC
<псевдоним столбца> ::=
<псевдоним>

Конструкция INTO TEMP

<конструкция INTO TEMP> ::=
INTO TEMP <имя временной таблицы> [WITH NO LOG]
<имя временной таблицы> ::=
<имя таблицы>

Подзапросы

<подзапрос> ::=
<элемент объединения> [<оператор объединения> <подзапрос>]

Оператор DELETE

<оператор DELETE> ::=
DELETE FROM <ссылка на таблицу или представление>
[WHERE <ссылка на строки>]
<ссылка на строки> ::=
<условие> | CURRENT OF <имя курсора>

Оператор INSERT

<оператор INSERT> ::=
INSERT INTO <ссылка на таблицу или представление>
[<список имен столбцов>] <значения для вставки>
<список имен столбцов> ::=
(<имя столбца>{, <имя столбца>})
<значения для вставки> ::=
<конструкция VALUES>
| <элемент объединения>
| EXECUTE PROCEDURE <имя процедуры> ([<список аргументов>])
<конструкция VALUES> ::=
VALUES (<источник значения> {, <источник значения>})
<источник значения> ::=
<переменная данных>[<индикатор>]
| <значение по умолчанию>

Оператор UPDATE

<оператор UPDATE> ::=
UPDATE <ссылка на таблицу или представление>
SET <одиночное или групповое присваивание>
[WHERE <ссылка на строки>]
<одиночное или групповое присваивание> ::=
<присваивание столбцу> {, <присваивание столбцу>}
| (<имя столбца> {, <имя столбца>}) =
 (<источник данных> {, <источник данных>})
| * = (<источник данных> {, <источник данных>})
<присваивание столбцу> ::=
<имя столбца> = <источник данных>
<источник данных> ::=
<выражение (кроме агрегирования)>
| (<подзапрос>)
| NULL

Создание процедур и триггеров

Оператор создания хранимой процедуры

<оператор создания процедуры> ::=
CREATE [DBA] PROCEDURE
<имя процедуры> ([<список параметров>])
[<конструкция RETURNING>]
<блок операторов> END PROCEDURE
[DOCUMENT <строка в кавычках> {, <строка в кавычках>}]
[WITH LISTING IN '<путь>'] ;
<список параметров> ::=
<параметр> {, <параметр>}
<параметр> ::=
<имя параметра> <тип параметра> [<значение по умолчанию>]
| REFERENCES <ссылочный тип> [DEFAULT NULL]
<имя параметра> ::=
<идентификатор>
<тип параметра> ::=
<тип данных SQL (подмножество)>
| LIKE <ссылка на таблицу или представление>.<имя столбца>
<конструкция RETURNING> ::=
RETURNING <тип возвращаемого значения>
{, <тип возвращаемого значения>} ;
<тип возвращаемого значения> ::=
<тип данных SQL (подмножество)>
| REFERENCES <ссылочный тип>

Оператор создания триггера

<оператор создания триггера> ::=
CREATE TRIGGER <имя триггера> <тело триггера>
<тело триггера> ::=
INSERT ON <имя таблицы> <раздел действий>
| INSERT ON <имя таблицы> <ссылки для INSERT>
 <раздел действий по ссылке>
| DELETE ON <имя таблицы> <раздел действий>
| DELETE ON <имя таблицы> <ссылки для DELETE>
 <раздел действий по ссылке>
| <конструкция UPDATE> ON <имя таблицы> <раздел действий>
| <конструкция UPDATE> ON <имя таблицы> <ссылки для UPDATE>
 <раздел действий по ссылке>
<раздел действий> ::=
BEFORE <список действий триггера>
 [FOR EACH ROW <список действий триггера>]
 [AFTER <список действий триггера>]
| FOR EACH ROW <список действий триггера>
 [AFTER <список действий триггера>]
| AFTER <список действий триггера>
<список действий триггера> ::=
<действие триггера> {, <действие триггера>}
<действие триггера> ::=
[WHEN (<условие>)]
(<допустимый оператор в триггере>
{, <допустимый оператор в триггере>})
<допустимый оператор в триггере> ::=
<оператор INSERT>
| <оператор DELETE>
| <оператор UPDATE>
| <оператор выполнения процедуры>
<раздел действий по ссылке> ::=
[BEFORE <список действий триггера>]
FOR EACH ROW <список действий триггера>
[AFTER <список действий триггера>]
<ссылки для INSERT> ::=
REFERENCING NEW [AS] <идентификатор>
<ссылки для DELETE> ::=
REFERENCING OLD [AS] <идентификатор>
<ссылки для UPDATE> ::=
REFERENCING NEW [AS] <идентификатор>
| REFERENCING OLD [AS] <идентификатор>
| REFERENCING NEW [AS] <идентификатор>
 OLD [AS] <идентификатор>
| REFERENCING OLD [AS] <идентификатор>
 NEW [AS] <идентификатор>
<конструкция UPDATE> ::=
UPDATE [OF <имя столбца> {, <имя столбца>}]

Операторы блокировки и управления транзакциями

Управление транзакциями

<оператор начала транзакции> ::=
BEGIN WORK
<оператор завершения транзакции> ::=
COMMIT WORK
<операторотката транзакции> ::=
ROLLBACK [WORK]
<оператор установки уровня изоляции транзакций INFORMIX> ::=
SET ISOLATION TO <уровень изоляции INFORMIX>
<уровень изоляции INFORMIX> ::=
DIRTY READ
| COMMITED READ
| CURSOR STABILITY
| REPEATABLE READ
<оператор установки уровня изоляции транзакций ANSI> ::=
SET TRANSACTION <чтение-запись>
 [, ISOLATION LEVEL <уровень изоляции ANSI>]
| SET TRANSACTION ISOLATION LEVEL <уровень изоляции ANSI>
 [, <чтение-запись>]
| SET TRANSACTION ISOLATION LEVEL READ UNCOMMITED
 [, READ ONLY]
| SET TRANSACTION READ ONLY
 [, ISOLATION LEVEL READ UNCOMMITED]
<чтение-запись> ::=
READ WRITE | READ ONLY
<уровень изоляции ANSI> ::=
READ COMMITED
| REPEATABLE READ
| SERIALIZABLE

Управление блокировками

<оператор установки режима блокировки> ::=
SET LOCK MODE TO <режим блокировки>
<режим блокировки> ::=
WAIT [<секунды>]
| NOT WAIT
<секунды> ::=
<целочисленный литерал>
<оператор блокирования таблицы> ::=
LOCK TABLE <таблица или синоним>
IN <режим блокирования таблицы> MODE
<таблица или синоним> ::=
<имя таблицы>
| <имя синонима>
<режим блокирования таблицы> ::=
SHARE | EXCLUSIVE
<оператор разблокирования таблицы> ::=
UNLOCK TABLE <таблица или синоним>

Copyright (c) 1999 V. Kravchuk, OpenXS Initiative