Язык модулей SQL

Язык модулей SQL

7.1 <Модуль> (<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>

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

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

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

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

	Если <раздел языка> (<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>). 

7.2. <Раздел имени модуля> (<module name clause>) 

Функция 

Задает имя <модуля> (<module>). 

Формат 

     <module name clause> ::=

              MODULE [<module name>]

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

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

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

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

7.3. <Процедура> (<procedure>) 

Функция 

Определяет процедуру и оператор языка SQL. 

Формат 

     <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>

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

	<Имя процедуры> (<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. 
ii) Любой <тип данных> (<data type>) в <объявлении параметров> (<parameter declaration>) должен быть CHARACTER или NUMERIC. 
iii) Если i-ое <объявление параметра> (<parameter declaration>) специфицирует <тип данных> (<data type>) CHARACTER(L) c некоторой <длиной> (<lenght>) L, то тип i-ого параметра должен быть буквенно-цифровым типом языка COBOL длины L. 
iv) Если i-ое <объявление параметра> (<parameter declaration>) специфицирует <тип данных> (<data type>) NUMERIC(P,S) c некоторыми <точностью> (<precision>) P и <масштабом> (<scale>) S, то типом i-ого параметра должен быть тип языка COBOL usage DISPLAY SIGN LEADING SEPARATE со следующим PICTURE: 

	Если S=P, то PICTURE: "S", за которым следует "V", и затем P экземпляров "9". 

	Если P > S > 0, то PICTURE: "S", за которым следуют P-S экземпляров "9", затем "V" и затем S экземпляров "9". 

	Если S=O, то PICTURE: "S", за которым следуют P экземпляров "9" и затем необязательное "V". 


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

	
i) Тип параметра SQLCODE должен быть типом INTEGER языка FORTRAN. 
ii) Любой <тип данных> (<data type>) в <объявлении параметра> должен быть CHARACTER, INTEGER, REAL или DOUBLE PRECISION. 
iii) Если i-ое <объявление параметра> (<parameter declaration>) специфицирует <тип данных> (<data type>) CHARACTER(L) с некоторой <длиной> (<lenght>) L, то тип i-ого параметра должен быть типом CHARACTER языка FORTRAN с длиной L. 
vi) Если i-ое <объявление параметра> (<parameter declaration>) специфицирует <тип данных> (<data type>) данных INTEGER, REAL или DOUBLE PRECISION, то тип i-ого параметра должен быть соответственно INTEGER, REAL или DOUBLE PRECISION языка FORTRAN. 


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

	
i) Тип параметра SQLCODE должен быть типом INTEGER языка Pascal. 
ii) Любой <тип данных> (<data type>) в <объявлении параметра> (<parameter declaration>) должен быть CHARACTER, INTEGER, или REAL. 
iii) Если i-ое <объявление параметра> (<parameter declaration>) специфицирует <тип данных> (<data type>) CHARACTER(L) с некоторой <длиной> (<lenght>) L, то тип i-ого параметра должен быть типом строки языка Pascal длины L. 
iv) Если i-ое <объявление параметра> (<parameter declaration>) специфицирует <тип данных> (<data type>) INTEGER или REAL, то тип i-ого параметра должен быть соответственно типом INTEGER, или REAL языка Pascal. 


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

	
i) Тип параметра SQLCODE должен быть FIXED BINARY(PP), где РР определяемая реализацией точность, большая или равная 15. 
ii) Любой <тип данных> (<data type>) в <объявлении параметра> (<parameter declaration>) должен быть CHARACTER, DECIMAL, или FLOAT. 
iii) Если i-ое <объявление параметра> (<parameter declaration>) специфицирует тип данных CHARACTER(L) с некоторой <длиной> (<lenght>) L, то тип i-ого параметра должен быть типом CHARACTER языка PL/1 с длиной L. 
vi) Если i-ое <объявление параметра> (<parameter declaration>) специфицирует тип данных DECIMAL(P,S) с некоторыми <точностью> (<precision>) P и <масштабом> (<scale>) S, то тип i-ого параметра должен быть типом FIXED REAL DECIMAL(P,S) языка PL/1. 
v) Если i-ое <объявление параметра> (<parameter declaration>) специфицирует тип данных FLOAT(P) с некоторой <точностью> (<precision>) P, то тип i-ого параметра должнен быть типом FLOAT REAL BINARY (P) языка PL/1. 

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

	<Процедура> (<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 устанавливается отрицательное число со значением, определяемым реализацией

Язык манипулирования данными (data manipulation language)

8.1 <Оператор закрытия> (<close statement>)

Функция 

Закрыть курсор. 

Формат 

     <close statement>::=

         CLOSE <cursor name>

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

	Объемлющий модуль должен содержать объявление курсора, в котором используется это же имя курсора. 

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

	Курсор должен быть в открытом состоянии. 

	Курсор переводится в закрытое состояние и разрушается копия <спецификации курсора> (<cursor soecificaton>). 

8.2. <Оператор фиксации> (<commit statement>) 

Функция 

Заканчивает текущую транзакцию с фиксацией. 

Формат 

     <commit statement>::=

              COMMIT WORK

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

Нет. 

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

	Текущая транзакция завершается. 

	Закрываются любые курсоры, открытые данной транзакцией. 

	Любые изменения базы данных, сделанные в текущей транзакции, фиксируются. 

8.3. <Объявление курсора> (<declare cursor>) 

Функция 

Определяет курсор. 

Формат 

     <declare cursor> ::=

               DECLARE <cursor name> CURSOR

               FOR <cursor specification>

     <cursor specification> ::=

               <query expression> [<order by clause>...]

     <query expression> ::=

                <query term>

              | <query expression> UNION [ALL] <query term>

     <query term> ::=

               <query specification> | (<query expression>)

     <order by clause> ::=

               ORDER BY <sort specification>

                        [{,<sort specification>}...]

     <sort specification> ::=

              { <unsigned integer> | <column specification> }

               [ASC | DESC]

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

	<Имя курсора> (<cursor name>) не должно быть идентичным любому другому <имени курсора> (<cursor name>), специфицируемого в каком-либо другом <объявлении курсора> (<declare cursor>) того же модуля. 

	Любое <имя параметра> (<parameter name>), содержащееся в <спецификации курсора> (<cursor specification>), должно быть определено в <объявлении параметра> (<paremeter declaration>) <процедуры> (<procedure>) объемлющего <модуля> (<module>), который содержит <оператор открытия> (<open statement>), специфицирующий это <имя курсора> (<cursor name>). 
Замечание: Cм. Синтаксическое правило 7.1, "<модуль> (<module>)". 

	Пусть Т обозначает таблицу, специфицированную в <спецификации курсора> (<cursor specification>). 

	
a) Если указано ORDER BY, то Т является только читаемой таблицей со специфицированным порядком сортировки. 
b) Если не указаны ни ORDER BY ни UNION и <спецификация запроса> (<query specification>) является из меняемой (updatable), то Т - изменяемая таблица. 
c) Иначе Т - только читаемая таблица. 

	
a) Если не указано UNION, то описанием Т является описание <спецификации запроса> (<query specification>). 
b) Если указано UNION, то пусть для каждого специфицированного UNION Т1 и Т2 обозначают таблицы, которые специфицированы в <выражении запроса> (<query expression>) и <терме запроса> (<query term>). <Список выборки> (<select list>) в спецификациях Т1 и Т2 должен состоять из "*" или <спецификаций столбцов> (<column specification>). Кроме имен столбцов, описания Т1 и Т2 должны быть идентичными. Все столбцы результата неименованы. За исключением <имен столбцов> (<column name>), описание результата такое же, как описание Т1 и Т2. 

	Если указано ORDER BY, то каждая <спецификация сортировки> (<sort specification>) в <разделе order by> (<order by clause>) должна идентифицировать столбец таблицы Т. 
a) Если <спецификация сортировки> (<sort specification>) содержит <спецификацию столбцов> (<column specification>), то <спецификация сортировки> (<sort specification>) идентифицирует столбец Т с именем, указанным в этой <спецификации столбца> (<column specification>). 
b) Если <спецификация сортировки> (<sort specification>) содержит <целое без знака> (<unsigned integer>), то это целое должно быть больше нуля и не более степени таблицы T. <Спецификация сортировки> (<sort specification>) указывает столбец Т с порядковой (ordinal) позицией, специфицируемой этим <целым без знака> (<unsigned integer>). 

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

	
a) Если Т изменяемая (updatable) таблица, то курсор ассоциируется с именованной таблицей, идентифицируемой <именем таблицы> (<table name>) из <раздела from> (<from clause>). Пусть В обозначает эту именованную таблицу. Для каждой строки в Т существует соответствующая строка в В, из которой получена строка таблицы Т. Когда курсор установлен на строку таблицы Т, курсор также установлен на соответствующую строку таблицы В. 
b) В противном случае курсор не ассоциируется с именованной таблицей. 

	
a) Если не указано UNION, то Т - это результат указанной <спецификации запроса> (<query specification>. 
b) Если UNION указано, то пусть для каждого указанного UNION Т1 и Т2 обозначают результаты <выражения запроса> (<query expression>) и <терма запроса> (<query term>). Результат UNION фактически порождается следующим образом: i) Инициализировать результат как пустую таблицу. 

	
ii) Занести в результат каждую строку Т1 и каждую строку Т2 
iii) Если не указано ALL , то удалить все излишние дубликаты строк из результата. 

	
a) Если не указано ORDER BY, то: 

	
i) Порядок строк в Т определяется реализацией. 
ii) Порядок строк может может быть разным в разных транзакциях. 
iii) Порядок строк Т, устанавливаемый при открытии курсора, будет таким же при следующем открытии курсора в этой же транзакции при условии, что: 

	Отсутствуют сторонние изменения каких-либо таблиц, указанным в спецификации курсора. 

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


b) Если ORDER BY указано, то Т обладает порядком сортировки: 

	
i) Порядок сортировки является последовательностью групп сортировки. Группа сортировки - это последовательность строк, в которых все значения столбцов сортировки идентичны. Более того, группа сортировки может быть последовательностью групп сортировки. 
ii) Мощность последовательности и порядковая позиция каждой группы сортировки определяется значениями наиболее значащих столбцов сортировки. Мощность последовательности является минимальным числом групп сортировки таких, что для каждой группы сортировки с числом строк больше единицы все значения столбца сортировки идентичны. 
iii) Если порядок сортировки основывается на дополнительных столбцах сортировки, то каждая группа сортировки с числом строк больше единицы является последовательностью групп сортировки. Мощность каждой последовательности и порядковая позиция каждой группы сортировки внутри каждой последовательности определяется значениями следующего наиболее значащего столбца сортировки. Мощность каждой последовательности является минимальным числом групп сортировки таких, что для каждой группы с числом строк больше единицы все значения этого столбца сортировки идентичны. 
iv) Предыдущий параграф применяется по очереди к каждому дополнительному столбцу сортировки. Если группа сортировки состоит из нескольких строк и не является последовательностью групп сортировки, то порядок строк в группе сортировки не определен. 
v) Пусть С обозначает столбец сортировки и S - последовательность, которая определяется значениями С. 
vi) Направление сортировки связывается с каждым столбцом сортировки. Если направление для С задано по возрастанию, то первая группа сортировки S содержит наименьшее значение С и каждая последующая группа сортировки содержит значение С большее, чем значение С в предшествующей группе сортировки. Если направление для С задано по убыванию, то первая группа сортировки S содержит наибольшее значение С и каждая последующая группа сортировки содержит значения С меньшее, чем значение С в предшествующей группе сортировки. 
vii) Упорядоченность определяется правилами сравнения, указанными в 5.11, "<Предикат сравнения"> (<comparison predicate>). Порядок неопределенных значений по отношению к не неопределенным значениям определяется реализацией, но должен быть либо строго больше либо строго меньше всех не неопределенных значений. 
viii) <Спецификация сортировки> (<sort specification>) специфицирует столбец сортировки и направление. Столбец сортировки - это столбец, указываемый <целым без знака> (<unsigned integer>) или <спецификацией столбца> (<column specification>). <Целое без знака> (<unsigned integer>) i ссылается на i-ый столбец Т. <Спецификация столбца> (<column specification>) указывает именованный столбец. 
ix) Если в <спецификации сортировки> (<sort specification>) указано DESC, то направление сортировки, специфицируемое этой <спецификацией сортировки> (<sort specification>), является направлением по убыванию. Если указано АSC или не указано ни ASC, ни DESC, то направление сортировки для этого столбца сортировки является направлением по возрастанию. 
x) Последовательность <спецификаций сортировки> (<sort specification>) определяет относительную значимость сортируемых столбцов. Столбец сортировки, указанный в первой <спецификации сортировки> (<sort specification>), наиболее значащий и каждый последующий столбец сортировки является менее значащим, чем предыдущий столбец сортировки. 

8.4. <Оператор удаления: позиционный> (<delete statement: positioned>) 

Функция 

Удаляет строку таблицы. 

Формат 

     <delete statement: positioned> ::=

                DELETE FROM <table name>

                WHERE CURRENT OF <cursor name>

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

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

	Содержащий <модуль> (<module>) должен содержать <объявление курсора> (<declare cursor>) CR с тем же <именем курсора> (<cursor name>), что и <имя курсора> (<cursor name>) в <операторе удаления: позиционном> (<delete statement: positioned>). 

	Таблица, на которую указывает CR, не должна быть только читаемой. 

	Пусть Т обозначает таблицу, идентифицируемую <именем таблицы> (<table name>). Т должна быть таблицей, идентифицируемой в первом <разделе from> (<from clause>) в <спецификации курсора> (<cursor specification>) CR. 

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

	Курсор CR должен быть установлен на строку. 

	Строка, из которой получена текущая строка CR, удаляется. 

8.5. <Оператор удаления: поисковый> (<delete statement: searched>) 

Функция 

Удаляет строки таблицы. 

Формат 

     <delete statement: searched> ::=

           DELETE FROM <table name>

           WHERE [<search condition>]

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

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

	Пусть Т обозначает таблицу, идентифицируемую <именем таблицы> (<table name>). Т не должна быть только читаемой таблицей или таблицей, которая идентифицируется в <разделе from> (<from clause>) любого <подзапроса> (<subquery>), содержащегося в <условии поиска> (<search condition>). 

	Область действия <имени таблицы> (<table name>) - целиком <оператор удаления: поисковый> (<delete statement: searched>. 

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

	
а) Если не указано <условие поиска> (<search condition>), то удаляются все строки таблицы Т. 
б) Если указано <условие поиска> (<search condition>), то условие применяется к каждой строке Т с <именем таблицы> (<table name>), связанным с этой строкой, и все строки, для которых результат <условия поиска> (<search condition>) есть true, удаляются. Каждый <подзапрос> (<subquery>) в <условии поиска> (<search condition>) реально выполняется для каждой строки T и результаты используются в применении <условия поиска> (<search condition>) к данной строке Т. Если любой выполняемый <подзапрос> (<subquery>) содержит внешнюю ссылку на столбец Т, то эта ссылка указывает на значение этого столбца в данной строке Т. 
Замечание: "Внешняя ссылка" определяется в 5.7, "<спецификация столбца> (<column specification>)". 

8.6. <Оператор чтения> (<fetch statement>) 

Функция 

Устанавливает курсор на следующую строку таблицы и выбирает значения из этой строки. 

Формат 

     <fetch statement> ::=

          FETCH <cursor name> INTO <fetch target list>

     <fetch target list> ::=

          <target specification>[{,<target specification>}...]

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

	Содержащий <модуль> (<module>) должен содержать <объявление курсора> (<declare cursor>) CR с тем же <именем курсора> (<cursor name>), что и <имя курсора> (<cursor name>) в <операторе чтения> (<fetch statement>). Пусть Т обозначает таблицу, специфицированную через <спецификации курсора> (<cursor specification>) CR. 

	Число <спецификаций цели> (<target specification>) в <списке целей чтения> (<fetch target list>) должно быть таким же как степень таблицы Т. 

	
а) Если тип данных цели, указанной i-ой <спецификацией цели> (<target specification>) <списка целей чтения> (<fetch target specification>), является типом символьных строк, то тип данных i-ого столбца таблицы Т должен быть типом символьных строк. 
b) Если тип данных цели, указанной i-ой <спецификацией цели> (<target specification>) <списка целей чтения> (<fetch target specification>), является типом точных чисел, то тип данных i-ого столбца таблицы Т должен быть типом точных чисел. 
c) Если тип данных цели, указанной i-ой <спецификацией цели> (<target specification>) <списка целей чтения> (<fetch target specification>), является типом приблизительных чисел, то тип данных i-ого столбца таблицы Т должен быть типом приблизительных чисел или типом точных чисел. 

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

	Курсор CR должен быть в открытом состоянии. 

	Если таблица, указываемая курсором CR, является пустой, или CR позиционирован на последнюю строку или за ней, то CR устанавливается в позицию после последней строки, параметру SQLCODE присваивается значение 100 и значения не присваиваются целям, идентифицированным в <списке целей чтения> (<fetch target list>). 

	Если CR установлен в позицию перед строкой, то CR устанавливается на эту строку и значения этой строки присваиваются соответствующим целям. 

	Если CR установлен на r, где r - это строка, отличная от последней строки, то курсор устанавливается на строку, непосредственно следующую за строкой r, и значения из строки за r присваиваются соответствующим целям. 

	Присваивание значений целям в <списке целей чтения> (<fetch target list>), кроме параметра SQLCODE, осуществляются в порядке, определяемом реализацией. Параметр SQLCODE получает значение последним. 

	Если в процессе присваивания значения цели возникает ошибка, то в параметр SQLCODE устанавливается отрицательное значение, определяемое реализацией, и значения целей, отличных от параметра SQLCODE, зависят от реализации. 

	Пусть V обозначает цель, а v - соответствующее значение в текущей строке CR. 

	Если v - это неопределенное значение, то для V должен быть специфицирован индикатор, и этот индикатор устанавливается в -1. Если v - не неопределенное значение, и V обладает индикатором, то: 
a) Если тип данных V есть тип символьных строк длины L и длина M v больше L, то индикатор получает значение M. 
b) Иначе значение индикатора устанавливается в 0. 

	Цель, идентифицированная i-той <спецификацией цели> (<target specification>) из <списка целей чтения> (<fetch target list>), соответствует i-ому значению из текущей строки CR. 

	
a) Если тип данных V есть тип символьных строк, и длина v равна длине V, то значением V становится v. 
b) Если тип данных V есть тип символьных строк длины L, и длина v больше L, то значением V становятся первые L символов v. 
c) Если тип данных V есть тип символьных строк длины L, и длина M v меньше L, то значением первых M символов V становится v, и в последние L-M символов V устанавливаются символы пробела. 
d) Если тип данных V есть тип точных чисел, то должно существовать представление значения v в типе данных V такое, чтобы не потерялись какие-либо первые значащие цифры, и значением V становится это представление. 
e) Если тип данных V есть тип приблизительных чисел, то значением V становится приблизительное значение v. 

<Оператор вставки> (<insert statement>) 

Функция 

Создает новые строки в таблице 

Формат 

     <insert statement> ::=

         INSERT INTO <table name> [(<insert column list>)]

         {VALUES (<insert value list>)|<query specification>}

     <insert column list> ::=

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

     <insert value list> ::=

                <insert value> [{,<insert value>...]

     <insert value> ::=

                <value specification> | NULL

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

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

	Пусть Т обозначает таблицу, идентифицируемую <именем таблицы> (<table name>). Т не должна быть только читаемой таблицей или таблицей, которая идентифицируется в <разделе from> (<from clause>) <спецификации запроса> (<query specification>) или какого-либо <подзапроса> (<subquery>), содержащегося в <спецификации запроса> (<query specification>). 

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

	Столбец, идентифицированный в <списке столбцов вставки> (<insert column list>), является объектным столбцом. 

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

	Если i-ый элемент <оператора вставки> (<insert statement>) не является неопределенным <значением вставки> (<insert statement>), то: 
а) Если тип данных столбца таблицы Т, указанный i-ым <именем столбца> (<column name>), является типом символьных строк длины L, то тип данных i-ого элемента <оператора вставки> (<insert statement>) должен быть типом символьных строк с длиной меньшей или равной L. 
b) Если тип данных столбца таблицы Т, указанный i-ым <именем столбца> (<column name>), является типом точных чисел, то тип данных i-ого элемента <оператора вставки> (<insert statement>) должен быть типом точных чисел. 
c) Если тип данных столбца таблицы Т, указанный i-ым <именем столбца> (<column name>), является типом приблизительных чисел, то тип данных i-ого элемента <оператора вставки> (<insert statement>) должен быть типом приблизительных чисел или типом точных чисел. 

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

	Строка вставляется по следующим шагам: 
а) Фактически создается возможная строка, как это указано в Общих правилах 6.4, "<Раздел умолчания> (<default clause>)". Если Т - это базовая таблица В, то возможная строка включает каждый столбец В. Если Т - это представляемая таблица, то возможная строка включает каждый столбец базовой таблицы В, из которой порождается Т. 
b) Для каждого объектного столбца в возможной строке его значение заменяется на вставляемое значение. 
c) Возможная строка вставляется в таблицу В. 

	Если Т - представляемая таблица, определенная через <определение представления> (<view definition>) с "WITH CHECK OPTION", то если <спецификация запроса> (<query specification>), содержащаяся в <определении представления> (<view definition>), включает <раздел where> (<where clause>), не содержащийся в <подзапросе> (<subquery>), то <условие поиска> (<search condition>) этого <раздела where> (<where clause>) должно быть истинным для возможной строки. 

	Если указывается <список вставляемых значений> (<insert value list>), то: 
а) Если i-ое <вставляемое значение> (<insert value>) из <списка вставляемых значений> (<insert value list>) является <спецификацией значения> (<value specification>), то значение столбца возможной строки, соответствущего i-ому объектному столбцу, является значением этой <спецификации значения> (<value specification>). 
b) Если i-ое <вставляемое значение> (<insert value>) из <списка вставляемых значений> (<insert value list>) является неопределенным значением, то значение столбца возможной строки, соответствующего i-ому объектному столбцу, является неопределенным значением. 

	Если указывается <спецификация запроса> (<query specification>), то пусть R обозначает результат этой <спецификации запроса> (<query specification>). Если R пуст, то параметру SQLCODE присваивается значение 100, и никакая строка не вставляется. Число созданных возможных строк равно мощности R. Вставляемые значения одной возможной строки являются значениями одной строки R, и значения в одной строке R являются вставляемыми значениями одной возможной строки. 

	Пусть V обозначает строку R или последовательность значений специфицированных <списком вставляемых значений> (insert value list>). Тогда i-ое значение V является вставляемым значением объектного столбца, идентифицируемого i-ым <именем столбца> (<column name>) в <списке вставляемых столбцов> (<insert column list>). 

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

	
а) Если тип данных С есть тип символьных строк и длина v равна длине С, то значение С устанавливается в v. 
b) Если тип данных С есть тип символьных строк и длина M v меньше L, то первые M символов C устанавливаются в v, и в последние L-M символы C заносится символ пробела. 
c) Если тип данных С есть тип точных чисел, то должно существовать представление значения v в типе данных С такое, чтобы не потерялись никакие первые значащие цифры, и это представление становится значением С. 
d) Если тип данных С есть тип приблизительных чисел, то значением С становится приблизительное значение v. 

8.8. <Оператор открытия> (<open statement>) 

Функция 

Открывает курсор 

Формат 

     <open statement> ::=

               OPEN <cursor name>

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

	Содержащий <модуль> (<module>) должен содержать <объявление курсора> (<declare cursor>) CR с тем же <именем курсора> (<cursor name>), что и <имя курсора> (<cursor name>) в <операторе открытия> (<open statement>). 

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

	Курсор CR должен быть в закрытом состоянии. 

	Пусть S обозначает <спецификацию курсора> (<cursor specification> курсора CR. 

	Курсор CR переводится в открытое состояние следующими шагами: 
а) Фактически создается копия S, в которой каждая <спецификация цели> (<target specification>) заменяется на значение идентифицируемой цели. 
b) Если S специфицирует только читаемую таблицу, то эта таблица фактически создается в соответствии со спецификацией - копией S. 
c) Курсор CR переводится в открытое состояние и его позиция устанавливается перед первой строкой таблицы. 

8.9. <Оператор отката> (<rollback statement>) 

Функция 

Завершает текущую транзакцию с откатом. 

Формат 

     <rollback statement> ::=

               ROLLBACK WORK

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

Нет. 

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

	Любые изменения базы данных, совершенные в текущей транзакции, аннулируются. 

	Любой курсор, открывавшийся в текущей транзакции, закрывается. 

	Текущая транзакция завершается. 

8.10. <Оператор выборки> (<select statement>) 

Функция 

Выбирает значения из специфицированной строки таблицы. 

Формат 

     <select statement> ::=

         SELECT [ALL | DISTINCT] <select name>

         INTO <select target list>

         <table expression>

     <select target list>::=

         <target specification> [{,<target specification>}...]

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

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

	<Выражение, <вырабатывающее таблицу> (<table expression>) не должно включать <раздел group by> (<group by clause>) или <раздел having> <having clause> и не должно идентифицировать сгруппированное представление. 

	Число элементов в <списке выборки> (<select list>) должно быть таким же, как число элементов в <списке целей выборки> (<select target list>). 

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

	Пусть S обозначает <спецификацию запроса> (<query specification>) с теми же <списком выборки> (<select list>) и <выражением, вырабатывающим таблицу> (<table expression>), какие указаны в <операторе выборки> (<select statement>), и содержащий ALL или DISTINCT, если они присутствуют в <операторе выборки> (<select statement>). S должна быть допустимой <спецификацией запроса> (<query specification>). 

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

	Пусть R обозначает результат <спецификации запроса> (<query specification>) S. 

	Мощность R не должна быть больше единицы. Если R пуст, то параметру SQLCODE присваивается значение 100 и и значения не присваиваются целям, идентифицированным в <списке целей выбора> (<select target list>). 

	Если R не пуст, то значения строки R присваиваются соответствующим целям. 

	Присваивание значений целям из <списка целей выборки> (<select target list>), кроме параметра SQLCODE, осуществляются в порядке, определяемом реализацией. Параметр SQLCODE получает значение последним. 

	Если в процессе присваивания значений целям фиксируется ошибка, то в параметр SQLCODE устанавливается отрицательное значение, определяемое реализацией, и значения целей, отличных от параметра SQLCODE, зависят от реализации. 

	Цель, идентифицированная i-той <спецификацией цели> (<target specification>) из <списка целей выборки> (<select target list>), соответствует i-ому значению в строке R. 

	Пусть V обозначает идентифицированную цель, а v соответствующее значение в строке R. 

	Если v является неопределенным значением, то для V должен быть специфицирован индикатор, и этот индикатор устанавливается в -1. Если v - не неопределенное значение, и V имеет индикатор, то: 
а) Если тип данных V есть тип символьных строк длины L и длина M v больше L, то индикатор получает значение M. 
b) В противном случае значение индикатора устанавливается в 0. 

	
a) Если тип данных V есть тип символьных строк, и длина v равна длине V, то значением V становится v. 
b) Если тип данных V есть тип символьных строк длины L, и длина v больше L, то значением V становятся первые L символов v. 
c) Если тип данных V есть тип символьных строк длины L, и длина M v меньше L, то значением первых M символов V становится v, и в последние L-M символов V устанавливается символ пробела. 
d) Если тип данных V есть тип точных чисел, то должно существовать представление значения v в типе данных V такое, чтобы не потерялись никакие первые значащие цифры, и значением V становится это представление. 
e) Если тип данных V есть тип приблизительных чисел, то значением V становится приблизительное значение v. 

8.11. <Оператор модификации: позиционный> (<update statement: positioned>) 

Функция 

Модифицирует строку таблицы. 

Формат 

     <update statement: positioned> ::=

               UPDATE <table name>

               SET <set clause:positioned>

                   [{,<set clause:positioned>}...]

               WHERE CURRENT OF <cursor name>

     <set clause: positioned> ::=

               <object column:positioned> =

               { <value expressionession> | NULL }

     <object column: positioned> ::= <column name>

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

	"Применимые <привилегии> (<privileges>)" к <имени таблицы> (<table name>) должны включать привилегию UPDATE для каждого <объектного столбца: позиционного> (<object column: positioned>). 
Замечание: "Применимые <привилегии> (<privileges>)" для <имени таблицы> (<table name>) определяются в 6.10, "<определение привилегий> (<privileges definition>)". 

	Содержащий <модуль> (<module>) должен содержать <объявление курсора> (<declare cursor>) CR с тем же <именем курсора> (<cursor name>), что и <имя курсора> (<cursor name>) в <операторе модификации: позиционном> (<update statement: positioned>). 

	Таблица, на которую указывает CR, не должна быть только читаемой. 

	Пусть Т обозначает таблицу, идентифицируемую <именем таблицы> (<table name>). Т должна быть таблицей, идентифицированной в первом <разделе from> (<from clause>) <спецификации курсора> (<cursor specification>) CR. 

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

	Каждое <имя столбца> (<column name>), специфицированное как <объектный столбец: позиционный> (<object column: positioned>), должно идентифицировать столбец T. Один <объектный столбец: позиционный> (<object column: positioned>) не должен появляться более одного раза в <операторе модификации: позиционном> (<update statement: positioned>). 

	Область действия <имени таблицы> (<table name>) - целиком весь оператор <модификации: позиционный> (<update statement: positioned>). 

	Для каждого <раздела установки: позиционного> (<set clause: positioned>): 
а) Если специфицировано неопределенное значение, то для столбца, указанного <объектным столбцом: позиционным> (<object column: positioned>), должно до пускаться неопределенное значение. 
b) Если тип данных столбца, указанного <объектным столбцом: позиционным> (<object column: positioned>), является типом символьных строк длины L, то тип данных <выражения, вырабатывающего значение> (<value expression>) должен быть типом символьных строк с длиной, меньшей или равной L. 
c) Если тип данных столбца, указанного <объектным столбцом: позиционным> (<object column: positioned>), является типом точных чисел, то тип данных <выражения, вырабатывающего значение> (<value expression>) должен быть типом точных чисел. 
d) Если тип данных столбца, указанного <объектным столбцом: позиционным> (<object column: positioned>), является типом приблизительных чисел, то тип данных <выражения, вырабатывающего значение> (<value expression>) должен быть типом приблизительных чисел или типом точных чисел. 

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

	Курсор CR должен быть установлен на строку. 

	Объектная строка является такой строкой, из которой порождена текущая строка CR. 

	Объектная строка модифицируется согласно спецификации каждого <раздела установки: позиционной> (<set clause: positioned>). <Раздел установки: позиционной> (<set clause: positioned>) специфицирует объектный столбец и значение модификации этого столбца. Объектный столбец - это столбец, идентифицированный <объектным столбцом: позиционным> (<object column: positioned>) в <разделе установки: позиционной> (<set clause: positioned>). Значение модификации может быть неопределенным значением или значением, специфицируемым <выражением, вырабатывающим значения> (<value expression>). Если <выражение, вырабатывающее значение> (<value expression>) содержит ссылку к столбцу Т, то эта ссылка указывает на значение этого столбца в объектной строке до модификации любого значения объектной строки. 

	Объектная строка модифицируется по следующим шагам: 
а) Создается возможная строка, которая является копией объектной строки. 
b) Для каждого <раздела установки: позиционной> (<set clause: positioned>) значение указанного объектного столбца в возможной строке заменяется на специфицированное значение модификации. 
c) Объектная строка заменяется на возможную строку. 

	Если Т- это представляемая таблица, определенная через <определение представления> (<view definition>) с "WITH CHECK OPTION", то если <спецификация запроса> (<query specification>), содержащееся в <определении представления> (<view definition>), включает <раздел where> (<where clause>), не содержащийся в <подзапросе> (<subquery>), то <условие поиска> (<search condition>) этого <раздела where> (<where clause>) должно быть true для возможной строки. 

	Пусть С обозначает объектный столбец. Пусть v обозначает не неопределенное значение модификации С. 

	
a) Если тип данных C есть тип символьных строк, и длина v равна длине C, то значением C становится v. 
b) Если тип данных C есть тип символьных строк длины L, и длина M v меньше L, то значением первых M символов C становится v, и в последние L-M символов C устанавливается символ пробела. 
c) Если тип данных C есть тип точных чисел, то должно существовать представление значения v в типе данных C такое, чтобы не потерялись никакие первые значащие цифры, и значением C становится это представление. 
d) Если тип данных C есть тип приблизительных чисел, то значением C становится приблизительное значение v. 

8.12 <Оператор модификации: поисковый> (<update statement: searched>) 

Функция 

Модифицирует строки таблицы. 

Формат 

     <update statement: searched> ::=

               UPDATE <table name>

               SET <set clause: searched>

                   [{,<set clause: searched>}...]

               [WHERE  <search conditions>]

     <set clause: searched> ::=

               <object column: searched> =

                { <value expression> | NULL }

     <object column: searched> ::= <column name>

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

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

	Пусть Т обозначает таблицу, идентифицируемую <именем таблицы> (<table name>). Т не должна быть только читаемой таблицей или таблицей, которая идентифицируется в <разделе from> (<from clause>) любого <подзапроса> (<subquery>), содержащегося в <условии поиска> (<search condition>). 

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

	Каждое <имя столбца> (<column name>), специфицированное как <объектный столбец: поисковый> (<object column: searched>), должно идентифицировать столбец T. Один <объектный столбец: поисковый> (<object column: searched>) не должен появляться более одного раза в <операторе модификации: поисковом> (<update statement: searched>). 

	Область действия <имени таблицы> (<table name>) - целиком <оператор модификации: поисковый> (<update statement: searched>. 

	Для каждого <раздела установки: поискового> (<set clause: searched>): 
а) Если специфицировано неопределенное значение, то для столбца, указанного <объектным столбцом: поисковым> (<object column: searched>), должно допускаться неопределенное значение. 
b) Если тип данных столбца, указанного <объектным столбцом: поисковым> (<object column: searched>), является типом символьных строк длины L, то тип данных <выражения, вырабатывающего значение> (<value expression>) должен быть типом символьных строк с длиной меньшей или равной L. 
c) Если тип данных столбца, указанного <объектным столбцом: поисковым> (<object column: searched>), является типом точных чисел, то тип данных <выражения, вырабатывающего значение> (<value expression>) должен быть типом точных чисел. 
d) Если тип данных столбца, указанного <объектным столбцом: поисковым> (<object column: searched>), является типом приблизительных чисел, то тип данных <выражения, вырабатывающего значение> (<value expression>) должен быть типом приблизительных чисел или типом точных чисел. 

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

	
а) Если не специфицировано <условие поиска> (<search condition>), то все строки Т являются объектными строками. 
b) Если условие поиска специфицировано, то это условие применяется к каждой строке Т с <именем таблицы> (<table name>), связанным с этой строкой, и объектными строками являются все строки, для которых результат <условия поиска> (<search condition>) есть true. Каждый <подзапрос> (<subquery>) в <условии поиска> (<search condition>) фактически выполняется для каждой строки T, и результат используется при применении <условия поиска> (<search condition>) к данной строке Т. Если какой-либо выполняемый <подзапрос> (<subquery>) содержит внешнюю ссылку на столец Т, то она указывает на значение этого столбца в данной строке Т. 
Замечание: "Внешняя ссылка" определяется в 5.7, "<column specification">. 

	Каждая объектная строка модифицируется согласно спецификации каждого <раздела установки: поисковой> (<set clause: searched>). <Раздел установки: поисковой> (<set clause: searched>) специфицирует объектный столбец и значение модификации этого столбца. Объектный столбец - это столбец, идентифицированный <объектным столбцом: поисковым> (<object column: searched>). Значение модификации может быть неопределенным значением или значением, специфицируемым <выражением, вырабатывающим значения> (<value expression>). Если <выражение, вырабатывающее значение> (<value expression>) содержит ссылку к столбцу Т, то эта ссылка указывает на значение этого столбца в объектной строке до модификации любого значения объектной строки. 

	Объектная строка модифицируется по следующим шагам: 
а) Создается возможная строка, которая является копией объектной строки. 
b) Для каждого <раздела установки: поисковой> (<set clause: searched>) значение указанного объектного столбца в возможной строке заменяется на специфицированное значение модификации. 
c) Объектная строка заменяется на возможную строку. 

	Если Т- это представляемая таблица, определенная через <определение представления> (<view definition>) с "WITH CHECK OPTION", то если <спецификация запроса> (<query specification>), содержащееся в <определении представления> (<view definition>), включает <раздел where> (<where clause>), не содержащийся в <подзапросе> (<subquery>), то <условие поиска> (<search condition>) этого <раздела where> (<where clause>) должно быть true для возможной строки. 

	Пусть С обозначает объектный столбец. Пусть v обозначает не неопределенное значение модификации С. 
a) Если тип данных C есть тип символьных строк, и длина v равна длине C, то значением C становится v. 
b) Если тип данных C есть тип символьных строк длины L, и длина M v меньше L, то значением первых M символов C становится v, и в последние L-M символов C устанавливается символ пробела. 
c) Если тип данных C есть тип точных чисел, то должно существовать представление значения v в типе данных C такое, чтобы не потерялись никакие первые значащие цифры, и значением C становится это представление. 
d) Если тип данных C есть тип приблизительных чисел, то значением C становится приблизительное значение v. 

Уровни

Этот стандарт специфицирует два уровня и отдельные средства поддержания целостности данных. 

Средства поддержания целостности данных образуют следующие синтаксические конструкции вместе с Синтаксическими правилами и Общими правилами: 

	<Раздел умолчаний> (<default clause>) 

	все опции <ограничения на столбец> (<column constraint>), отличные от NOT NULL и NOT NULL UNIQUE 

	все опции <определения ограничения на таблицу> (<table constraint definition>), кроме опции UNIQUE <список столбцов уникальности> (UNIQUE (<unique column list>)). 

	<действие> REFERENCES <список столбцов передачи> (<action> REFERENCES [ (<grant column list>)]) 

Уровень 2 - это полный язык базы данных SQL, не включающий средства улучшения целостности данных. Уровень 1 - это подмножество уровня 2, которое подчиняется следующим дополнительным правилам. 

	4.16, "Транзакции": 
а) Первое предложение параграфа 1 заменяется следующим: 
Транзакция - это последовательность операций, включающая операции над базой данных, которые являются атомарными по отношению к восстановлению. 
b) Параграф 2 удаляется. 
c) Второе предложение параграфа 3 удаляется. 

	5.3, "Лексемы (<token>): 
<Идентификатор> (<identifier>) не должен состоять более чем из 12 символов. 

	5.4, "Имена": 
<Имя таблицы> (<table name>) не должно содержать <идентификатор полномочий> (<authorization identifier>). 

	5.6, "<Спецификация значения> (<value specification>) и <спецификация цели> (<target specification>)": 
а) <Спецификация значения> (<value specification>) не должна содержать USER. 
b) <Спецификация параметра> (<parameter specification>) не должна специфицировать <парамететр-индикатор> (<indicator parameter>). 
c) <Спецификация переменной> (<variable specification>) не должна специфицировать <переменную-индикатор> (<indicator variable>). 

	5.7, "<Спецификация столбца> (<column specification>)" : 
К синтаксическому правилу 4 добавляется следующее: 

	<Спецификация столбца> (<column specification>) не должна быть внешней ссылкой. 

	5.8, "<Спецификация функции над множеством> (<set function specification>)" 5.24, <Подзапрос> (<subquery>), и 5.25, <Cпецификация запроса> (<query specification>): 

	<Функция надо всеми элементами множества> (<all set function>), <подзапрос> (<subquery>) и <спецификация запроса (<query specification>) не должны содержать ALL. 


Замечание: на уровне 1 сохранение дубликатов специфицируется отсутствием DISTINCT. 

	5.8, "<Спецификация функций над множеством> (<set function specification>)": 

	<Функция над различными элементами множества> (<distinct set function>) не должны включать AVG, MAX, MIN или SUM. 

	5.11, "<Предикат сравнения> (<comaprison predicate>)" : <Оператор сравнения> (<comp op>) не должен включать "<>". Замечание: на уровне 1 сравнение в форме "A <> B" выражается через эквивалент "NOT A=B". 

	5.14, "<предикат like> (<like predicate>): 
а) <Предикат like> (<like predicate>) не должен специфицировать ESCAPE <символ escape> (<escape character>). 
b) <Предикат like> (<like predicate>) не должен специфицировать NOT. 
Замечание: на уровне 1 <предикат like> (<like predicate>), содержащий NOT, может быть выражен в эквивалентной форме <условия поиска> (<search condition>): "NOT <like predicate>". 

	5.17, "<предикат exists> (<exists predicate>)": 

	<Предикат> (<predicate>) не должен специфицировать <предикат exists> (<exists predicate>). 

	5.22, "<раздел group by>" (<group by clause>)": 
Следующее предложение добавляется к Общему правилу 2: 

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

	5.25, "<Спецификация запроса> (<query specification>)": 
Синтаксическое правило 11 заменяется на следующее: 

	Распознавание того, является ли <спецификация запроса> (<query specification>) изменяемой или только читаемой, определяется в реализации. 

	6.1, "<Схема> (<schema>)": 
<Схема> (<schema>) не должна специфицироваться. 
Уровень 1 реализации должен обеспечивать некоторый механизм связи <идентификатора полномочий> (<authorization identifier>) с <определением таблицы> (<table definition>), <определением представления> (<view definition>) или <определением привилегий> (<privileges definition>). 

	6.2, "<Определение таблицы> (<table definition>)": 
<Определение таблицы> (<table definition>) не должно содержать <определение огpаничения уникальности> (<unique constraint definition>). Уровень реализации 1 должен обеспечивать некоторый механизм спецификации ограничения таблицы, связанного с уникальностью. 

	6.3, "<Определение столбцов> (<column definition>): 
а) <Тип данных> (<data type>) в <определении столбца> (<column definition>) не должен включать REAL, DOUBLE, PRECISION и NUMERIC. 
b) <Определение столбца> (<column definition>) столбца не должно специфицировать NOT NULL. 
c) <Определение столбца> (<column definition>) столбца не должно специфицировать UNIQUE. 

	6.9, "<Определение представления> (<view definition>): 
<Определение представления> (<view definition>) не должно содержать WITH CHECK OPTION. 

	6.10, "<Определение привилегий> (<privilege definition>)" : 
<Определение привилегий> (<privileges definition>) не должно содержать WITH GRANT OPTION. 

	7.3, "<Процедура> (<procedure>): 
а) Cинтаксическое правило 8 (a) (2) заменяется на следующее: 
Любой <тип данных> (<data type>) в <объявлении параметра> (<parameter declaration>) должен специфицировать тип CHARACTER. 
b) В общем правиле 3 случай (a) каждое вхождение числа "100" заменяется на слова "положительное число со значением, определяемым реализацией" 
c) Общее правило 3 (b) (1) заменяется на следующее: 
В реализации определяется, аннулируются ли при выполнении S изменения, произведенные в базе данных. 

	8.3, "<Объявление курсора> (<declare cursor>)": 
а) <Спецификация сортировки> (<sort specification>) не должна содержать <целых без знака> (<unsigned integer>). 
b) <Спецификация сортировки> (<sort specification>) не должна содержать ASC. 
Замечание: на уровне 1 порядок по возрастанию специфицируется отсутствием опции DESC. 
c) <Выражение запроса> (<query expression>) не должно содержать UNION. 
Замечание: на уровне 1 функция объединения не поддерживается. 

	8.7, "<Оператор вставки> (<insert statement>) : 
<Оператор вставки> (<insert statement>) не должен содержать <спецификацию запроса> (<query specification>). 

	8.11, "<Оператор модификации: позиционный> (<update statement: positioned>)" и <оператор удаления: поизиционный> (<delete statement: positioned>): 
<Оператор SQL> (<SQL statement>) не должен специфицировать <оператор модификации: позиционный> (<update statement: positioned>) или <оператор удаления: позиционный> (<delete statement: positioned>).