Системы обработки информации - язык баз данных SQL

         

Формат


<subquery> ::=

(SELECT [ALL | DISTINCT] <result specification>

<table expression>)

<result specification> ::=

<value expression>

| *



Формат


<query specification> ::=

(SELECT [ALL | DISTINCT] <select list>

<table expression>)

<select list> ::=

<value expression> [{,<value expression>}]

| *



Формат


<schema> ::=

CREATE SCHEMA <schema authorization clause>



[<schema element>...]

<schema authorization clause> ::=

AUTHORIZATION <schema authorization identifier>

<schema authorization identifier> ::=

<authorization identifier>

<schema element> ::=

<table definition>

| <view definition>

| <privilege definition>



Формат


<table definition> ::=

CREATE TABLE <table name>

(<table element> [{,<table element>}...])

<table element> ::=

<column definition>

| <table constraint definition>



Формат


<column definition> ::=

<column name> <data type>

[<default clause>]

[<column constraint>...]

<column constraint> ::=

NOT NULL [<unique specification>]

| <references specification>

| CHECK (<search condition>)



Функция


Специфицирует мультимножество значений, полученных из результата <выражения, вырабатывающего таблицу> (<table expression>).



Функция


Специфицирует таблицу, полученную из результата <выражения, вырабатывающего таблицу> (<table expression>).



Общие правила


Если R не является сгруппированной таблицей и <выражение, вырабатывающее значение> (<value expression>) включает <спецификацию функции над множеством> (<set function specification>), то R является аргументом или источником аргумента каждой <спецификации функции над множеством> (<set function specification>) в <выражении, вырабатывающем значение> (<value expression>) и результат <подзапроса> (<subquery>) есть значение, специфицированное <выражением, вырабатывающем значение> (<value expression>).

Если R не является сгруппированной таблицей и <выражение, вырабатывающее значение> (<value expression>) не включает <спецификацию функции над множеством> (<set function specification>), то <выражение, вырабатывающее значение> (<value expression>) применяется к каждой строке R, образуя мультимножество из n значений, где n - мощность R. Если не указано ключевое слово DISTINCT, то это мультимножество является результатом <подзапроса> (<subquery>). Если DISTINCT указано, то результатом <подзапроса> (<subquery>) является множество значений, получаемое из этого мультимножества удалением любых избыточных дублирующих значений.

Если R - сгруппированная таблица, то <выражение, вырабатывающее значение> (<value expression>) применяется к каждой группе R, образуя мультимножество из n значений, где n - число групп в R. Когда <выражение, вырабатывающее значение> (<value expression>) применяется к данной группе R, эта группа является аргументом или источником аргумента каждой <спецификации функции над множеством> (<set function specification>) в <выражении, вырабатывающем значение> (<value expression>). Если не указано ключевое слово DISTINCT, то это мультимножество является результатом <подзапроса> (<subquery>). Если DISTINCT указано, то результатом <подзапроса> (<subquery>) является множество значений, получаемое из этого мультимножества удалением любых избыточных дублирующих значений.



Общие правила


Если R не является сгруппированной таблицей и <список выборки> (<select list>) включает <спецификацию функции над множеством> (<set function specification>), то R является аргументом или источником аргумента каждой <спецификации функции над множеством> (<set function specification>) в <списке выборки> (<select list>) и результат <спецификации запроса> (<query specification>) есть таблица, состоящая из одной строки. I-ое значение строки есть значение, специфицированное i-ым <выражением, вырабатывающим значение> (<value expression>).

Если R не является сгруппированной таблицей и <список выборки> (<select list>) не включает <спецификацию функции над множеством> (<set function specification>), то каждое <выражение, вырабатывающее значение> (<value expression>) применяется к каждой строке R, образуя таблицу из m строк, где m - мощность R. I-ый столбец таблицы содержит значения, полученные применением i-ого <выражения, вырабатывающего значение> (<value expression>). Если не указано ключевое слово DISTINCT, то эта таблица является результатом <спецификации запроса> (<query specification>). Если DISTINCT указано, то результатом <спецификации запроса> (<query specification>) является таблица, получаемая из этой таблицы удалением любых избыточных дублирующих значений.

Если R - сгруппированная таблица с нулевым числом групп, то результатом <спецификации запроса> (<query specification>) является пустая таблица.

Если R - сгруппированная таблица с одной или более групп, то каждое <выражение, вырабатывающее значение> (<value expression>) применяется к каждой группе R, образуя таблицу из m строк, где m - число групп в R. I-ый столбец таблицы содержит значения, полученные применением i-ого <выражения, вырабатывающего значения> (<value expression>). Когда <выражение, вырабатывающее значение> (<value expression>) применяется к данной группе R, эта группа является аргументом или источником аргумента каждой <спецификации функции над множеством> (<set function specification>) в <выражении, вырабатывающем значение> (<value expression>). Если не указано ключевое слово DISTINCT, то эта таблица является результатом <спецификации запроса> (<query specification>). Если DISTINCT указано, то результатом <спецификации запроса> (<query specification>) является таблица, получаемая из этой таблицы удалением любых избыточных дублирующих строк.

Строка является дубликатом другой строки в том и только в том случае, когда все пары значений с одной и той же порядковой позицией идентичны.



Общие правила


<Определение таблицы> (<table definition>) определяет базовую таблицу.



Синтаксические правила


Применимые привилегии для каждого <имени таблицы> (<table name>), содержащегося в <выражении, вырабатывающем таблицу> (<table expression>), должны включать SELECT.


Замечание: "Применимые <привилегии> (<privileges>)" для <имени таблицы> (<table name>) определяются в , "<определение привилегий> (<privileges definition>)".


a) Если <спецификация результата> (<result specification>) "*" указана в <подзапросе> (<subquery>) какого-либо <предиката> (<predicate>), отличного от <предиката exists> (<exists predicate>), то степень <выражения, вырабатываающего таблицу> (<table expression>) должна быть равна 1 и <спецификация результата> (<result specification>) эквивалентна <выражению, вырабатывающему значение> (<value expression>), состоящему из <спецификации столбца> (<column specification>), указывающей на единственный столбец <выражения, вырабатывающего таблицу> (<table expression>).


b) Если <спецификация результата> (<result specification>) "*" указана в <подзапросе> (<subquery>) <предиката exists> (<exists predicate>), то <спецификация результата> (<result specification>) эквивалентна произвольному <выражению, вырабатывающему значение> (<value expression>), не включающему <спецификацию функции над множеством> (<table expression>) и допустимому в <подзапросе> (<subquery>).

Тип данных значений <подзапроса> (<subquery>) есть тип данных явного или неявного <выражения, вырабатывающего значение> (<value expression>).

Пусть R обозначает результат <выражения, вырабатывающего таблицу> (<table expression>).

Каждая <спецификация столбца> (<column specification>) в <выражении, вырабатывающем значение> (<value expression>) должна недвусмысленно ссылаться на столбец R.



Синтаксические правила


Применимые привилегии для каждого <имени таблицы> (<table name>), содержащегося в <выражении, вырабатывающем таблицу> (<table expression>), должны включать SELECT.


Замечание: "Применимые <привилегии> (<privileges>)" для <имени таблицы> (<table name>) определяются в , "<определение привилегий> (<privileges definition>)".

Пусть R обозначает результат <выражения, вырабатывающего таблицу> (<table specification>).

Степень таблицы, специфицированной через <спецификацию запроса> (<query specification>) равна мощности <списка выборки> (<select list>).

<Список выборки> (<select list>) "*" эквивалентен последовательности <выражений, вырабатывающих значение> (<value expression>), в которой каждое <выражение, вырабатывающее значение> (<value expression>) является <спецификацией столбца> (<column specification>), указывающей на столбец R, и каждый столбец R указывается ровно один раз. Столбцы указываются в порядке возрастания номеров их исходных позиций внутри R.

Каждая <спецификация столбца> (<column specification>) в каждом <выражении, вырабатывающем значение> (<value expression>) должна однозначно указывать на столбец R. <Ключевое слово> (<key word>) DISTINCT не должно указываться более одного раза в <спецификации запроса> (<query specification>) за исключением любого <подзапроса> (<subquery>) этой <спецификации запроса> (<query specification>).

Если R - это сгруппированное представление, то <список выборки> (<select list>) не должен содержать <спецификацию функции над множеством> (<set function specification>).

Если R - это сгруппированная таблица, то каждая <спецификация столбца> (<column specification>) в каждом <выражении, вырабатывающем значение> (<value expression>) должна указывать на столбец группирования или быть специфицированной внутри <спецификации функции над множеством> (<set function specification>). Если R - это не сгруппированная таблица и какое-либо <выражение, вырабатывающее значение> (<value expression>) включает <спецификацию функции над множеством> (<set function specification>), то каждая <спецификация столбца> (<column specification>) в любом <выражении, вырабатывающем значение> (<value expression>) должна быть указана внутри <спецификации функции над множеством> (<set function specification>).



Синтаксические правила


<Идентификатор полномочий схемы> (<schema authorization identifier>) должен быть отличным от <идентификатора полномочий схемы> (<schema authorization identifier>) любой другой <схемы> (<schema>) в той же самой среде. Понятие среды определяется в реализации.



Синтаксические правила


Если <имя таблицы> (<table name>) содержит <идентификатор полномочий> (<authorization identifier>), то этот <идентификатор полномочий> (<authorization identifier>) должен быть таким же, как <идентификатор полномочий схемы> (<schema authorization identifier>) содержащей схемы.

<Имя таблицы> (<table name>) должно быть отличным от <имени таблицы> (<table name>) любого другого <определения таблицы> (<table definition>) или <определения представления> (<view definition>) содержащей <схемы> (<schema>).

<Определение таблицы> (<table definition>) должно содержать по меньшей мере одно <определение столбца> (<column definition>).

Областью действия <имени таблицы> (<table name>) является <определение таблицы> (<table definition>).

Описание таблицы, определенной через <определение таблицы> (<table definition>) включает имя <имя таблицы> (<table name>) и описание столбцов, специфицированное каждым <определением столбца> (<column definition>. Описание i-го столбца предоставляется i-ым <определением столбца> (<column definition>).



Синтаксические правила


<Имя столбца> (<column name>) должно быть отличным от <имени столбца> (<column name>) любого другого <определения столбца> (<column definition>) содержащегося в <определении таблицы> (<table definition>).

I-ый столбец таблицы описывается i-ым <определением столбца> (<column definition>) в <определении таблицы> (<table definition>). Имя и тип данных столбца определяются <именем столбца> (<column name>) и <типом данных> (<data type>) соответственно.

Пусть C обозначает <имя столбца> (<column name>) в <определении столбца> (<column definition>).

Если указано NOT NULL, то неявно вводится следующее <определение проверочного ограничения> (<check constraint definition>): CHECK (C IS NOT NULL)

Если не указано NOT NULL и не указан <раздел умолчания> (<default clause>), то неявно вводится DEFAULT NULL.

Если указана <спецификация уникальности> (<unique specification>), то неявно вводится следующее <определение ограничения уникальности> (<unique constraint definition>):

<unique specification> (C)


Замечание: <Спецификация уникальности> (<unique specification>) определяется в 6.6, "<определение ограничения уникальности> (<unique constraint definition>)".

Если указана <спецификация ссылок> (<references specification>), то неявно вводится следующее <определение ограничения ссылок> (<referential constraint definition>):

FOREIGN KEY(C) <references specification>


Замечание: <Спецификация ссылок> (<references specification>) определяется в 6.7, "<определение ограничения ссылок> (<referential constraint definition>)".

Если указано CHECK, то каждая <спецификация столбца> (<column specification>) в <условии поиска> (<search condition>) должна ссылаться на столбец C, и неявно вводится следующее <определение проверочного ограничения> (<check constraint definition):

CHECK (<search condition>)

Описание столбца, определенного через <определение столбца> (<column definition>), включает имя <имя столбца> (<column name>) и тип данных, специфицированный <типом данных> (<data type>).



Формат


<default clause> ::=

DEFAULT { <literal> | USER | NULL }



Формат


<table constraint definition> ::=

<unique constraint definition>

| <referential constraint definition>

| <check constraint definition>



Формат


<unique constraint definition> ::=

<unique specification> (<unique column list>)

<unique specification> ::=

UNIQUE | PRIMARY KEY

<unique column list> ::=

<column name> [{,<column name>}...]



Формат


<referential constraint definition> ::=

FOREIGN KEY (<referencing columns>)

<references specification>

<references specification> ::=

REFERENCES <referenced table and columns>

<referencing columns> ::=

<reference column list>

<referenced table and columns> ::=

<table name> [(<reference column list>)]

<reference column list> ::=

<column name> [{,<column name>}...]



Формат


<check constraint definition> ::=

CHECK (<search condition>)



Формат


<view definition> ::=

CREATE VIEW <table name> [(<view column list>)]

AS <query specification>

[WITH CHECK OPTION]

<view column list> ::=

<column name> [{,<column name>}...]



Формат


<privilege definition> ::=

GRANT <privileges> ON <table name>

TO <grantee> [{,<grantee>}...]

[WITH GRANT OPTION]

<privileges> ::=

ALL PRIVILEGES

| <action> [{,<action>}...]

<action> ::=

SELECT | INSERT | DELETE

| UPDATE [(<grant column list>)]

| REFERENCES [(<grant column list>]

<grant column list> ::=

<column name> [{,<column name>}...]

<grantee> ::=

PUBLIC | <authorization identifier>



Функция


Специфицирует умолчание для <определения столбца> (<column definition>).



Функция


Специфицирует ограничение уникальности для таблицы.



Общие правила


Когда строка заносится в таблицу, специфицированную содержащим раздел умолчания <определением таблицы> (<table definition>), столбец, определенный через <определение столбца> (<column definition>), инициализируется следующим образом:


a) Если <определение столбца> (<column definition>) не содержит <раздела умолчания> (<default clause>) или если явно или неявно определяется <раздел умолчания> (<default clause>), специфицирующий NULL, то столбец инициализируется неопределенным значением.


b) Если <определение столбца> (<column definition>) содержит <раздел умолчания> (<default clause>), специфицирующий <литерал> (<literal>), то:


i) Если <тип данных> (<data type>) <определения столбца> (<column definition>) есть тип точных или приблизительных чисел, то столбец инициализируется численным значением <литерала> (<literal>).


ii) Если <тип данных> (<data type>) <определения столбца> (<column definition>) есть тип данных символьных строк с длиной, равной длине <литерала> (<literal>), то столбец инициализируется значением этого <литерала> (<literal>).


iii) Если <тип данных> (<data type>) <определения столбца> (<column definition>) есть тип символьных строк с длиной большей, чем длина <литерала> (<literal>), то столбец инициализируется значением <литерала> (<literal>), расширенным при необходимости символами пробела вправо до длины <типа данных> (<data type>).


c) Если <определение столбца> (<column definition>) включает <раздел умолчания> (<default clause>) со спецификацией USER, то столбец инициализируется значением, определяемым USER, расширенной символами пробела вправо до длины <типа данных> (<data type>) <определения столбца> (<column definition>).



Общие правила


<Определение ограничения на таблицу> (<table constraint definition>) фактически проверяется после выполнения каждого <оператора SQL> (<SQL statement>).



Общие правила


Пусть термин "назначенные столбцы" обозначает столбцы, идентифицируемые <именами столбцов> (<column name>) в <списке столбцов уникальности> (<unique column list>).

Ограничение уникальности обязывает T не содержать строк, назначенные столбцы которых образуют дубликаты. Две строки являются дубликатами, если значение каждого назначенного столбца в первой строке равно значению соответствующего столбца во второй строке. Ограничение фактически проверяется после выполнения каждого <оператора SQL> (<SQL statement>).



Общие правила


Ссылающаяся таблица и ссылаемая таблица удовлетворяют <определению ограничения на ссылки> (<referential constraint definition>) в том и только в том случае, когда для каждой строки ссылающейся таблицы либо:


a) Все ссылающиеся столбцы в строке содержат не неопределенные значения и существует строка в ссылаемой таблице такая, что для каждого ссылающегося столбца значение ссылающегося столбца равно значению соответствующего ссылаемого столбца, либо


b) Какой-либо ссылающийся столбец в строке содержит неопределенное значение.



Общие правила


База данных не удовлетворяет <определению проверочного ограничения> (<check constraint definition>) в том и только в том случае, когда таблица, определенная через содержащее <определение таблицы> (<table definition>), содержит строку, для которой <условие поиска> (<search condition>) есть false.



Общие правила


<Определение представления> (<view definition>) определяет представляемую таблицу. Представляемая таблица V - это таблица, которая явилась бы результатом выполнения <спецификации запроса> (<query specification>). Является ли представляемая таблица материализованной определяется в реализации.

Если V - изменяемая (updatable) таблица, то пусть T обозначает таблицу, идентифицируемую <именем таблицы> (<table name>), которое указано в первом <разделе from> (<from clause>) в <спецификации запроса> (<query specification>). Для каждой строки в V существует соответствующая строка в T, из которой получается эта строка V. Для каждого столбца в V существует соответствующий столбец в T, из которого получается этот столбец V. Занесение строки в V является занесением соответствующей строки в T. Удаление строки из V является удалением соответствующей строки из T. Модификация столбца строки в V является модификацией соответствующей строки в T.


a) Если указано WITH CHECK OPTION, и <спецификация запроса> (<query specification>) содержит <раздел where> (<where clause>), то применение к представлению <оператора вставки> (<insert statement>), <оператора модификации: позиционного> (<update statement: positioned>) или <оператора модификации: поискового> (<update statement: searched>) не должно приводить к созданию строки, для которой результат этого <раздела where> (<where clause>) есть false.


b) Если WITH CHECK OPTION не указано, то <определение представления> (<view definition>) не должно ограничивать значения данных, которые могут быть занесены в изменяемую (updatable) представляемую таблицу.


Замечание: См. Общее правило 2 в , "<Оператор вставки> (<insert statement>)", Общее правило 5 в , "<Оператор модификации: позиционный> (<update statement: positioned>)" и Общее правило 4 в , "<Оператор модификации: поисковый> (<update statement: searched>)".



Синтаксические правила


<Тип данных> (<data type>) объекта <раздела умолчания> (<default clause>) есть <тип данных> (<data type>) содержащего этот раздел <определения столбца> (<column definition>).


a) Если указан <литерал> (<literal>), то:


i) Если <тип данных> (<data type>) объекта есть тип символьных строк, то <литерал> (<literal>) должен быть <литералом символьной строки> (<character string literal>). Длина <литерала символьной строки> (<character string literal>) не должна быть больше, чем <длина> (<lenght>) <типа данных> (<data type>) объекта.


ii) Если <тип данных> (<data type>) объекта есть тип точных чисел, то <литерал> (<literal>) должен быть <литералом точного числа> (<exact numeric literal>) и должно существовать представление значения <литерала точного числа> (<exact numeric literal>) в <типе данных> (<data type>) объекта, в котором не теряются никакие значащие цифры.


iii) Если <тип данных> (<data type>) объекта есть тип приблизительных чисел, то литерал должен быть <литералом приблизительного числа> (<approximate numeric literal>) или <литералом точного числа> (<exact numeric literal>).


b) Если указано USER, то <тип данных> (<data type>) объекта должен быть типом символьных строк и <длина> (<lenght>) <типа данных> (<data type>) объекта должна быть больше или равна 18.


c) Если указано NULL, то содержащее раздел умолчания <определение столбца> (<column definition>) не должно специфицировать NO NULL.



Синтаксические правила


Пусть T обозначает таблицу, для которой определяется ограничение.

Каждое <имя столбца> (<column name>) в <списке столбцов уникальности> (<unique column list>) должно идентифицировать столбец T, и один столбец не должен указываться более одного раза.

В <определении столбца> (<column definition>) для каждого <имени столбца> (<column name>) в <списке столбцов уникальности> (<unique column list>) должно быть указано NO NULL.

В <определении таблицы> (<table definition>) должно содержаться не более одного явного или неявного <определения ограничения уникальности> (<unique constraint definition>), специфицирующего PRIMARY KEY.



Синтаксические правила


Пусть термин "ссылающаяся таблица" обозначает таблицу, для которой определяется ограничение. Пусть термин "ссылаемая таблица" обозначает таблицу, идентифицируемую <именем таблицы> (<table name>) в <ссылаемых таблице и столбцах> (<referenced table and columns>). Пусть термин "ссылающиеся столбцы" обозначает столбцы, идентифицируемые <списком столбцов ссылки> (<reference column list>) в <ссылающихся столбцах> (<referencing columns>).


a) Если в <ссылаемых таблице и столбцах> (<referenced table and columns>) указывается <имя столбца> (<column name>) или <список столбцов ссылки> (<reference column list>), то эти <имя столбца> (<column name>) или <список столбцов ссылки> (<reference column list>) должны быть идентичны <списку столбцов уникальности> (<unique column list>) в <определении ограничения уникальности> (<unique constraint definition>) ссылочной таблицы. Пусть термин "ссылаемые столбцы" обозначает столбцы, идентифицируемые этими <именем столбца> (<column name>) или <списком столбцов ссылки> (<reference column list>).


b) Если в <ссылаемых таблице и столбцах> (<referenced table and columns>) не указывается <имя столбца> (<column name>) или <список столбцов ссылки> (<reference column list>), то <определение таблицы> (<table definition>) для ссылаемой таблицы должно содержать <определение ограничения уникальности> (<unique constraint definition>), специфицирующее PRIMARY KEY. Пусть термин "ссылаемые столбцы" обозначает столбцы, идентифицируемые <списком столбцов уникальности> (<unique column list>) в этом <определении ограничения уникальности> (<unique constraint definition>).

Применимые <привилегии> (<privileges>) для <имени таблицы> (<table name>) должны включать REFERENCES для каждого ссылаемого столбца.



Синтаксические правила


<Условие поиска> (<search condition>) не должно содержать <подзапроса> (<subquery>), <спецификации функции над множеством> (<set function specification>) или <спецификации цели> (<target specification>).

Каждая <спецификация столбца> (<column specification>) в <условии поиска> (<search condition>) должна ссылаться на столбец, определенный в содержащем <определении таблицы> (<table definition>).



Синтаксические правила


Если <имя таблицы> (<table name>) содержит <идентификатор полномочий> (<authorization identifier>), то этот <идентификатор полномочий> (<authorization identifier>) должен быть таким же, как и <идентификатор полномочий схемы> (<schema authorization identifier>) содержащей <схемы> (<schema>).

<Имя таблицы> (<table name>) должно быть отличным от <имени таблицы> (<table name>) любого другого <определения представления> (<view definition>) или <определения таблицы> (<table definition>) в содержащей <схеме> (<schema>).

Если <спецификация запроса> (<query specification>) является изменяемой (updatable), то представляемая таблица является изменяемой таблицей. В противном случае это только читаемая таблица.

Если какие-либо два столбца в таблице, определяемой <спецификацией запроса> (<query specification>), имеют одно и то же <имя столбца> (<column name>) или если какой-либо столбец этой таблицы является неименованным столбцом, то должен быть указан <список столбцов представления> (<view column list>).

Одно <имя столбца> (<column name>) не должно указываться более одного раза в <списке столбцов представления> (<view column list>).

Число <имен столбцов> (<column name>) в <списке столбцов представления> (<view column list>) должно быть таким же, что и степень таблицы, определяемой <спецификацией запроса> (<query specification>).

Описание таблицы, определенной через <определение представления> (<view definition>), включает имя <имя таблицы> (<table name>) и описания столбцов таблицы, специфицированной через <спецификацию запроса> (<query specification>). Если указывается <список столбцов представления> (<view column list>), то имя i-ого столбца есть i-ое <имя столбца> (<column name>) в этом <списке столбцов представления> (<view column list>).

Если <спецификация запроса> (<query specification>) содержит <раздел group by> (<group by clause>) или <раздел having> (<having clause>), не содержащиеся в <подзапросе> (<subquery>), то представляемая таблица, определенная через данное <определение представления> (<view definition>), является сгруппированной таблицей.

Если указано WITH CHECK OPTION, то представляемая таблица должна быть изменяемой (updatable).



Синтаксические правила


Пусть T обозначает таблицу, идентифицируемую <именем таблицы> (<table name>). <Привилегии> (<privileges>) определяют одну или более привилегий на T.

UPDATE (<grant column list>) специфицирует привилегию UPDATE для каждого столбца T, указанного в <списке разрешаемых столбцов> (<grant column list>). Каждое <имя столбца> (<column name>) в <списке разрешаемых столбцов> (<grant column list>) должно идентифицировать столбец T. Если <список разрешаемых столбцов> (<grant column list>) опущен, то UPDATE специфицирует привилегию UPDATE для всех столбцов T.

REFERENCES (<grant column list>) специфицирует привилегию REFERENCES для каждого столбца T, указанного в <списке разрешаемых столбцов> (<grant column list>). Каждое <имя столбца> (<column name>) в <списке разрешаемых столбцов> (<grant column list>) должно идентифицировать столбец T. Если <список разрешаемых столбцов> (<grant column list>) опущен, то REFERENCES специфицирует привилегию REFERENCES для всех столбцов T.

Применимые <привилегии> (<privileges>) для ссылки на <имя таблицы> (<table name>) определяются следующим образом:


a)


i) Если вхождение <имени таблицы> (<table name>) содержится в <схеме> (<schema>), то пусть применимым <идентификатором полномочий> (<authorization identifier>) будет <идентификатор полномочий> (<authorization identifier>), указанный как <идентификатор полномочий схемы> (<schema authorization identifier>) этой <схемы> (<schema>).


ii) Если вхождение <имени таблицы> (<table name>) содержится в <модуле> (<module>), то пусть применимым <идентификатором полномочий> (<authorization identifier>) будет <идентификатор полномочий> (<authorization identifier>), указанный как <идентификатор полномочий модуля> (<module authorization identifier>) этого <модуля> (<module>).



Формат


<module> ::=

<module name clause>

<language clause>

<module autorization clause>

[<declare cursor>...]

< procedure > ...

<language clause> ::=

LANGUAGE { COBOL | FORTRAN | PASCAL | PLI }

<module autorization clause> ::=

AUTHORIZATION <module autorization identifier>

<module autorization identifier> ::=

<autorization identifier>



Формат


<module name clause> ::=

MODULE [<module name>]



Формат


<procedure> ::=

PROCEDURE <procedure name>

<parameter declaration>...;

<SQL statment>;

<parameter declaration>::=

<parameter name> <data type>

| <SQLCODE parameter>

<SQLCODE parameter> ::=

SQLCODE

<SQL statement> ::=

<close statement>

| <commit statement>

| <delete statement positioned>

| <delete statement searched>

| <fetch statement>

| <insert statement>

| <open statement>

| <rollback statement>

| <select statement>

| <update statement positioned>

| <update statement searched>



Общие правила


Если <раздел языка> (<language clause>) <модуля> (<module>) специфицирует COBOL (соответственно FORTRAN, PASCAL, PLI) и если агент, выполняющий вызов <процедуры> (<procedure>) этого <модуля> (<module>), не является стандартной программой на языке COBOL (соответственно FORTRAN, Pascal, PL/1), то результат неопределен.

После выполнения агентом на языке программирования последнего вызова <процедуры> (<procedure>) в <модуле> (<module>) неявно выполняется <оператор фиксации> (<commit statement>) или <оператор отката> (<rollback statement>). Выбор одного из этих <операторов SQL> (<SQL statement>) определяется реализацией. Если имеет место невосстанавлваемая ошибка, то СУБД должна выполнить <оператор отката> (<rollback statement>).



Общие правила


<Раздел имени модуля> (<module name clause>) определяет необязательный <идентификатор> (<identifier>) как <имя модуля> (<module name>), определяющее содержащий <модуль> (<module>) в данном окружении.



Общие правила


<Процедура> (<procedure>) определяет процедуру, которая может вызываться определяемым реализацией агентом.

Когда процедура вызывается агентом языка программирования:


а) Если для этого агента нет активной транзакции, то транзакция фактически инициируется и связывается с этим вызовом и с последующими вызовами этим агентом любой <процедуры> (<procedure>) в содержащем <модуле> (<module>), до тех пор, пока данный агент не закончит эту транзакцию.


b) Выполняется <оператор SQL> (<SQL statement>) S данной <процедуры> (<procedure>).


а) Если S выполнен успешно, то


i) Если S - <оператор чтения> (<fetch statement>) , для которого следующая строка не существует, то в параметр SQLCODE устанавливается значение 100.


ii) Если S - <оператор вставки> (<insert statement>), для которого не нашлось ни одной возможной строки, то в параметр SQLCODE устанавливается значение 100.


iii) Если S - <оператор выборки> (<select statement>), результатом которого явилась пустая таблица, то в параметр SQLCODE устанавливается значение 100.


iv) Если S - <оператор модификации: поисковый> (<update statement: searched>) или <оператор удаления: поисковый>) (<delete statement: searched>) с поиском, для которых не нашлись объектные строки для модификации или удаления, то в параметр SQLCODE устанавливается значение 100.


v) Во всех остальных случаях в параметр SQLCODE устанавливается 0.


b) Если S выполнен неуспешно, то


i) Все изменения, произведенные над базой данных при выполнении S, аннулируются.


ii) В параметр SQLCODE устанавливается отрицательное число со значением, определяемым реализацией.

| |



Синтаксические правила


Для каждого <определения курсора> (<cursor declare>) в <модуле> (<module>) должна существовать ровно одна <процедура> (<procedure>) в этом <модуле> (<module>), которая содержит <оператор открытия> (<open statement>) со спецификацией <имени курсора> (<cursor name>), объявленного в <объявлении курсора> (<cursor declare>).

<Модуль> (<module>) должен быть ассоциирован с прикладной программой при ее выполнения. Прикладная программа должна быть ассоциирована не более чем с одним <модулем> (<module>).



Синтаксические правила


<Имя модуля> (<module name>) должно отличаться от <имени модуля> (<module name>) любого другого <модуля> (<module>) в том же окружении. Понятие окружения определяется в реализации.



Синтаксические правила


<Имя процедуры> (<procedure name>) должно отличаться от <имени процедуры> (<procedure name>) любой другой <процедуры> (<procedure>) в содержащем модуле.

<Имя параметра> <parameter name> в каждом <объявлении параметра> (<parameter declaration>) в <процедуре> (<procedure>) должно отличаться от <имени параметра> (<parameter name>) любого другого <объявления параметра> (<parameter declaration>) в этой процедуры.

Любое <имя параметра> (<parameter name>), содержащееся в <операторе SQL> (<SQL statement>) <процедуры> (<procedure>), должно быть специфицировано в <объявлении параметра> (<parameter declaration>) этой процедуры.

Если <имя столбца> (<column name>) в <операторе SQL> (<SQL statement>) совпадает с <именем параметра> (<parameter name>) в <объявлении параметра> (<parameter declaration>) <процедуры> (<procedure>), содержащей этот <оператор SQL> (<SQL statement>), то <спецификация столбца> (<column specification>), которая содержит это <имя столбца> (<column name>), должна содержать <квалификатор> (<qualifier>).

Законный вызов <процедуры> (<procedure>) должен поставлять n параметров, где n - число <объявлений параметров> (<parameter declaration>) в данной <процедуре> (<procedure>).

Процедура должна содержать ровно один <параметр SQLCODE> (<SQLCODE parameter>). На параметр, соответствующий параметру SQLCODE, ссыля4аются я0как я4на параметр SQLCODE.

<Разделом языка> (<language clause>) процедуры явля<раздел языка> (<language clause>) содержащего <модуля> (<module>).


a) Если <раздел языка> (<language clause>) специфицирует COBOL, то:


i) Типом параметра SQLCODE должен быть COMPUTATIONAL S9(PC), где PC - определяемая реализацией точность, большая или равная 4.