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

База данных

База данных есть набор всех данных, определенных <схемами> () в среде. Понятие среды является определяемым реализацией.

Числа

Число - это либо точное численное значение, либо приблизительное численное значение. Все числа являются сравнимыми значениями.
Каждое точное численное значение обладает точностью и масштабом. Точность - это положительное целое число, которое определяет число значащих десятичных цифр. Масштаб - это неотрицательное целое число. Масштаб 0 означает, что число является целым. При масштабе N точное численное значение есть целое значение значащих цифр, умноженное на 10 в степени N.
Приблизительные численные значения состоят из мантиссы и порядка. Мантисса - это численное значение со знаком, порядок - это целое со знаком, определяющее значимость мантиссы. Приблизительное численное значение обладает точностью. Точность это положительное целое число, определяющее число значащих двоичных цифр в мантиссе.
При присвоении точного численного значения элементу данных или параметру, представляющему точное численное значение, сохраняющее лидирующие значащие цифры приближение этого значения представляется в целевом типе данных. Значение преобразуется таким образом, чтобы получить целевые точность и масштаб.
При присвоении точного или приблизительного численного значения элементу данных или параметру, представляющим приблизительное численное значение, сохраняющее лидирующие значащие цифры приближение этого значения представляется в целевом типе данных. Значение преобразуется таким образом, чтобы получить целевую точность.

Курсоры

Курсор определяется через <объявление курсора> (). Для каждого <объявления курсора> () в <модуле> () курсор фактически cоздается тогда, когда образуется транзакция (см. 4.16, "Транзакции"), ссылающаяся на этот <модуль> (), и уничтожается, когда эта транзакция завершается.
Курсор находится либо в открытом состоянии, либо в закрытом состоянии. Начальное состояние курсора - закрытое. Курсор переходит в открытое состояние через <оператор открытия> () и возвращается в закрытое состояние через <оператор закрытия> (), <оператор фиксации> () или <оператор отката> ().
Курсор в открытом состоянии определяет таблицу, порядок строк в этой таблице и позицию относительно этого порядка. Если <объявление курсора> () не включает <раздел упорядочивания> () или включает <раздел упорядочивания> (), не полностью определяющий порядок строк, то строки в таблице имеют порядок, полностью или частично определенный в реализации.
Внутри одной транзакции, если порядок строк не определен или не полностью определен через <раздел упорядочивания> (), относительная позиция двух строк будет в общем случае одна и та же при каждом открытии курсора. Порядок может изменяться от одного раза к другому, если меняются значения базы данных или значения параметров, указанных в <спецификации запроса> () в <объявлении курсора> ().
В разных транзакциях, даже когда значения базы данных и значения параметров, указанных в <спецификации запроса> (), одинаковы, порядок строк, определяемый одинаковыми <спецификациейкурсора>() и <оператором открытия> (), может быть различным.

Позиция курсора в открытом состоянии может быть перед определенной строкой, на определенной строке или после последней строки. Если курсор установлен на строку, то эта строка является текущей строкой курсора. Курсор может быть установлен перед первой строкой или после последней строки, даже если таблица пуста.

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

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

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

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

Рабочая таблица - это таблица, возникающая вследствие открытия курсора. Приводит ли открытие курсора к созданию рабочей базовой таблицы или рабочей представляемой таблицы, определяется в реализации.

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

Рабочая базовая таблица создается при открытии курсора и уничтожается при закрытии курсора.

Множества

Множество есть неупорядоченный набор различных объектов.
Мультимножество есть неупорядоченный набор объектов, которые не обязательно различны.
Последовательность есть упорядоченный набор объектов, которые не обязательно различны.
Мощность набора есть число объектов в этом наборе. Если не оговорено противное, любой набор может быть пустым.

Модули

<Модуль> () есть долговременно хранимый объект, определенный на языке модулей. <Модуль> () состоит из необязательного <имя модуля> (), <раздела языка> (), <раздела полномочий модуля> (), ноля или более курсоров, определенных через <объявление курсора> () и одной или более <процедур> ().
Прикладная программа есть сегмент выполняемого кода, содержащий, возможно, несколько подпрограмм. Единственный <модуль> () ассоциируется с прикладной программой в течение ее выполнения. Прикладная программа должна быть ассоциирована с самое большее одним <модулем> (). Способ установления этой ассоциации, включающий возможное требование выполнения некоторого определенного в реализации оператора, определяется в реализации.

Назначение и область применения

Этот стандарт определяет синтаксис и семантику двух языков баз данных:
  • Язык определения схем (SQL-DLL) для объявления структур и ограничений целостности базы данных SQL.

  • Язык модулей и манипулирования данными (SQL-DML) для объявления процедур базы данных и выполняемых операторов в конкретной прикладной программе базы данных.

  • Этот стандарт определяет логические структуры данных и базовые операции для базы данных SQL. Он обеспечивает функциональные возможности для проектирования, доступа, поддержания, управления и защиты базы данных.
    Этот стандарт обеспечивает средство для мобильности определений базы данных и прикладных программ между соответствующими стандарту реализациями.
    Этот стандарт определяет два уровня и отдельное средство поддержания целостности. Уровень 2 - это полный язык баз данных SQL, не включающий средство поддержания целостности. Уровень 1 - это подмножество уровня 2, определенное в разделе 9 "Уровни" .
    Замечание: Планируется дополнительный язык SQL как дополнение к этому стандарту. Основными темами, обсуждаемыми для этого приложения, являются улучшенное управление транзакциями, определение некоторых правил, объявляемых в конкретной реализации, улучшенные средства работы с символами и поддержка национальных наборов символов.
    Средство поддержания целостности состоит в определении:
  • требуемых ограничений на ссылки между таблицами;

  • проверочных ограничений на строки таблицы;

  • значений столбца по умолчанию при занесении строки в
    таблицу.

  • В приложениях к стандарту определяется синтаксис включения операторов манипулирования данными SQL в стандартную во всех остальных отношениях прикладную программу. Такой синтаксис определяется как сокращенная нотация для стандартной прикладной программы, в которой встроенные операторы SQL заменены явными "вызовами" процедур базы данных, содержащими операторы SQL.
    Этот стандарт применим к реализациям, существующим в среде, которая может включать прикладные языки программирования, языки запросов уровня конечного пользователя, системы генерации отчетов, системы словарей данных и распределенные коммуникационные системы, а также различные средства проектирования баз данных, администрирования баз данных и оптимизации производительности.

    Нотация

    В качестве синтаксической нотации в этом стандарте используются БНФ ("Бэкусовские нормальные формы" или "Формы Бэкуса-Наура) со следующими расширениями:
  • Квадратные скобки ([]) обозначают необязательные элементы.

  • Многоточия (...) обозначают элементы, которые могут повторяться один или более раз.

  • Фигурные скобки ({ }) объединяют последовательности элементов.

  • В синтаксисе БНФ продукционный символ определяется как содержащий продукционный символ , если входит в расширение . Если содержит , то содержится в . Если содержит , то является "содержащим" продукционным символом для .

    Ограничения целостности

    Ограничения целостности определяют допустимые значения базы данных путем ограничения значений в базовых таблицах.
    Ограничения целостности фактически проверяются после выполнения каждого <оператора SQL> (). Если базовая таблица, ассоциированная с ограничением целостности, не удовлетворяет этому ограничению целостности, то <оператор SQL> () не выполняется, и в параметр SQLCODE устанавливается определенное в реализации отрицательное число.
    <Определение ограничения уникальности> () требует, чтобы никакие две строки в таблице не имели одинаковых значений в указанном столбце или столбцах.
    Спецификация NOT NULL требует, чтобы никакие значения в столбце не были неопределенными значениями.
    <Определение ограничения ссылок> () требует, чтобы для каждой строки одной указанной таблицы - "ссылающейся таблицы" - значения указанного столбца или столбцов либо включали как минимум одно неопределенное значение, либо были бы такими же, как значения указанного столбца или столбцов в некоторой строке другой указанной таблицы - "ссылаемой таблицы". Ссылающаяся таблица может быть той же самой таблицей, что и ссылаемая таблица.
    <Определение проверочного ограничения> () требует, чтобы указанное <условие поиска> () не было ложно ни для какой строки таблицы.

    Операторы

    <Оператор SQL> () определяет операцию над базой данных или операцию над курсором. <Оператор выборки> (), либо <подзапрос> (), либо <спецификация запроса> () (см. , "<Раздел from> ()"). Области действия могут быть вложенными. В разных областях действия одно и то же <имя кореляции> () может быть ассоциировано с разными таблицами или с одной и той же таблицей.
  • <Имя столбца> () идентифицирует именованный столбец. <Идентификатор> () определяется как <имя столбца> () через <определение таблицы> () или через <определение представления> ().
  • <Имя модуля> () идентифицирует <модуль> ().

  • <Имя курсора> () идентифицирует <курсор> ().

  • <Имя процедуры> () идентифицирует <процедуру> ().

  • <Имя параметра> () идентифицирует параметр.



  • CHAR - это синоним для CHARACTER. DEC - это синоним для DECIMAL. INT - это синоним для INTEGER.

  • Значение <целого без знака> (), т.е. <длина> (> или <точность> (), должно быть больше 0.

  • Если <длина> () опущена, то она предполагается равной 1. Если <масштаб> () опущен, то предполагается равным 0. Если опущена <точность> (), то значение определяется в реализации.

  • <Масштаб> () для <типа точных чисел> () не должен быть больше, чем <точность> () для <типа точных чисел> ().

  • CHARACTER специфицирует тип данных строк символов с длиной, специфицируемой <длиной> ().

  • NUMERIC специфицирует тип данных точных чисел с точностью и масштабом, специфицируемыми через <точность> () и <масштаб> ().

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

  • INTEGER специфицирует тип данных точных чисел с определенной в реализации точностью и масштабом 0.

  • SMALLINT специфицирует тип данных точных чисел с масштабом 0 и определенной в реализации точностью не большей, чем определенная в реализации точность INTEGER.

  • FLOAT специфицирует тип данных приблизительных чисел с двоичной точностью, равной или большей значения указанной <точности> ().

  • REAL специфицирует тип данных приблизительных чисел с определенной в реализации точностью.

  • DOUBLE PRECISION специфицирует тип данных приблизительных чисел с определенной в реализации точностью большей, чем определенная в реализации точность для REAL.



  • <Спецификация значения> () специфицирует значение, которое не выбирается из таблицы.

  • <Спецификация параметра> () идентифицирует параметр или параметр и параметр-индикатор. Тип данных параметра-индикатора должен быть типом точных чисел со шкалой 0. Конкретный <тип точных чисел> () параметров-индикаторов определяется в реализации.

  • <Спецификация переменной> () идентифицирует переменную включающего языка или переменную включающего языка и переменную-индикатор. Тип данных переменной-индикатора должен быть определенным в реализации типом данных для параметров-индикаторов.

  • <Спецификация цели> () специфицирует параметр или переменную, которым может быть присвоено значение.

  • <Спецификация параметра> () должна содержаться в <модуле> (). <Спецификация переменной> () должна со держаться во <встроенном операторе SQL> ().

  • Тип данных USER - это символьная строка длины, определенной в реализации.


  • <Предикат> ()

    Функция
    Специфицирует условие, для которого может быть вычислено истиностное значение "true", "false" или "unknown".
    Формат
    ::=

    |
    |
    |
    |
    |
    |
    Синтаксические правила
    Нет.
    Общие правила
  • Результат <предиката> () получается его применением к данной строке таблицы.


  • <Предикат сравнения> ()

    Функция
    Специфицирует сравнение двух значений.
    Формат
    ::=

    { | }
    ::=
    = | <> | < | > | <= | >=
    Синтаксические правила
  • Тип данных первого <выражения, вырабатывающего результат> () и <подзапроса> () или второго <выражения, вырабатывающего значение> () должны быть сравнимыми.

  • Общие правила
  • Пусть x обозначает результат первого <выражения, вырабатывающего значение> () и пусть y обозначает результат <подзапроса> () или второго <выражения, вырабатывающего значение> (). Мощность результата <подзапроса> () не должна быть больше единицы.

  • Если x или y являются неопределенными значениями или если результат <подзапроса> () пустой, то результатом "x y" является unknown.

  • Если x и y являются не неопределенными значениями, то результатом "x y" является true или false: "x = y" есть true тогда и только тогда, когда x и y равны. "x <> y" есть true тогда и только тогда, когда x и y не равны. "x < y" есть true тогда и только тогда, когда x меньше, чем y. "x > y" есть true тогда и только тогда, когда x больше, чем y. "x <= y" есть true тогда и только тогда, когда x не больше, чем y. "x >= y" есть true тогда и только тогда, когда x не меньше, чем y.

  • Числа сравниваются в соответствии с их алгебраическими значениями.

  • Сравнение двух символьных строк определяется через сравнение <символов> () с одинаковыми порядковыми позициями. Если строки не имеют одинаковую длину, то сравнение производится с рабочей копией более короткой строки, дополненной справа пробелами таким образом, чтобы она имела длину, равную длине другой строки.

  • Две строки равны, если все <символы> () с одинаковыми порядковыми позициями совпадают. Если две строки не равны, то их отношение определяется на основе сравнения первой пары неравных <символов> () с левого конца строк. Это сравнение производится в соответствии с определенной в реализации последовательностью сопоставления.

  • Хотя "x = y" есть unknown, если x и y являются неопределенными значениями, в контекстах GROUP BY, ORDER BY и DISTINCT неопределенное значение идентично или является дубликатом другого неопределенного значения.

  • | |

    <Спецификация функции над множеством> ()

    Функция
    Специфицирует значение, получаемое применением функции к аргументу.
    Формат
    ::=
    COUNT(*) |
    |
    ::=
    { AVG | MAX | MIN | SUM | COUNT }
    (DISTNICT )
    ::=
    { AVG | MAX | MIN | SUM }
    ([ALL] )
    Синтаксические правила
  • Аргумент COUNT(*) и источник аргумента <функции над различными элементами множества> () и <функции надо всеми элементами множества> () - это таблица или группа сгруппированной таблицы в соответствии со спецификациями в , "<Выражение, вырабатывающее таблицу> (
  • )", , "<Подзапрос> ()" и , "<Спецификация запроса> ()".
  • Пусть R обозначает аргумент или источник аргумента <спецификации функции над множеством> ().

  • <Спецификация столбца> () <функции над различными элементами множества> () и каждая <спецификация столбца> () в <выражении, вырабатывающем значение> () <функции надо всеми элементами множества> () должны недвусмысленно ссылаться на столбец R и не должны ссылаться на столбец, порожденный из <спецификации функции над множеством> ().

  • <Выражение, вырабатывающее значение> () <функции надо всеми элементами множества> должно включать <спецификацию столбца> (), которая ссылается на столбец R, и не должно включать <спецификацию функции над множеством> (). Если <спецификация столбца> () является внешней ссылкой, то <выражение, вырабатывающее значение> () не должно включать никаких операторов.
    Замечание: "Внешняя ссылка" определяется в , "<Спецификация столбца> ().


  • Если <спецификация функции над множеством> () содержит <спецификацию столбца> (), являющуюся внешней ссылкой, то <спецификации функции над множеством> () должна содержаться в <подзапросе> () <статьи having> ().

    Замечание: "Внешняя ссылка" определяется в 5.7, "<Спецификация столбца> ().


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


  • Если указывается COUNT, то тип данных результата <спецификации функции над множеством> () - это тип точных чисел с определенной в реализации точностью и масштабом 0.


  • Если указывается MAX или MIN, то тип данных результата есть T.


  • Если указывается SUM или AVG, то:

    a) тип T не должен быть типом символьных строк.

    b) если указывается SUM и T - тип точных чисел с масштабом S, то тип данных результата - тип точных чисел с определенной в реализации точностью и масштабом S.

    c) если указывается AVG и T - тип точных чисел с масштабом S, то тип данных результата - тип точных чисел с определенными в реализации точностью и масштабом.

    d) если T - тип приблизительных чисел, то тип результата - тип приблизительных чисел с определенной в реализации точностью.


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

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


  • Аргументом <функции надо всеми элементами множества> () является мультимножество значений. Это мультимножество получается путем удаления всех неопределенных значений из результата применения <выражения, вырабатывающего значение> () к каждой строке R. Указание или неуказание ALL не влияет на смысл <функции надо всеми элементами множества> ().



  • Пусть S обозначает аргумент <функции над различными элементами множества> () или <функции надо всеми элементами множества> ().


  • Тогда:

    a) Если задается <функция над различными элементами множества> () COUNT, то результатом является мощность S.

    b) Если задается функция COUNT(*), то результатом является мощность R.

    c) Если задается функция AVG, MAX, MIN или SUM и S пусто, то результатом является неопределенное значение.

    d) Если задается MAX или MIN, то результатом является, соответственно, максимальное или минимальное значение в S. Эти результаты определяются с использованием правил сравнения, определенных в , "".

    e) Если задается SUM, то результатом является суммазначений в S. Сумма должна быть в пределах диапазона значений типа данных результата.

    f) Если задается AVG, то результатом является среднеезначение значений в S. Сумма значений в S должнабыть в пределах диапазона значений типа данных результата.


  • <Спецификация столбца> ()

    Функция
    Указание именованного столбца.
    Формат
    ::=
    [.]
    ::=
    |
    Синтаксические правила
  • <Спецификация столбца> указывает именованный столбец. Смысл указания столбца зависит от контекста.

  • Пусть C <имя столбца> () в <спецификации столбца> ().

  • Тогда:

    a) Если <спецификация столбца> () содержит <квалификатор>(), то <спецификация столбца> должна содержаться в области действия одного или более <иментаблиц> (
  • ) или <имен кореляции>(), равных <квалификатору>(). Если таких <имен таблиц> () или <имен кореляции> ()больше одного, то используется имя с наиболее локальной областью действия. Таблица, ассоциированнаяс указанным <именем таблицы> (
    ) или<именем кореляции> (), должнавключать столбец с <именем столбца> () C.

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

    Замечание: "Область действия" <имени таблицы> (table name> или <имени кореляции> () специфицируется в "<Раздел from> ()", , "<Определение таблицы> (
    )" , , "<Оператор удаления: поисковый> ()" , , "<Оператор модификации: позиционный> ()" и , "<Оператор модификации: поисковый>()".

  • Если <спецификация столбца> () содержится в <выражении над таблицами> (
  • ) T и область действия явно или неявно указанного <квалификатора> () <спецификации столбца> () есть некоторый <оператор SQL> () или <выражение над таблицами> (
    ), содержащее <выражение над таблицами> (
    ) T, то <спецификация столбца> () является "внешней ссылкой" на таблицу, ассоциированную с этим <квалификатором> ().

  • Пусть T обозначает таблицу, ассоциированную с явно или неявно специфицированным <квалификатором> () R. Тип данных <спецификации столбца> () есть тип данных столбца C таблицы T.


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

  • "C" или "R.C" ссылаются на столбец C данной строки T.


  • <Выражение, вырабатывающее значение> ()

    Функция
    Специфицирует значение.
    Формат
    ::=

    | +
    | -
    ::=

    | *
    | /
    ::=
    [+|-]
    ::=

    |
    |
    | ( )
    Синтаксические правила
  • <Выражение, вырабатывающее значение> (), включающее <функцию над различными элементами множества>, не должно включать никаких двухместных операторов.

  • Первый <символ> () <лексемы> (), следующей за одноместным оператором, не должен быть знаком плюс или минус.

  • Если тип данных <первичного выражения> () является типом символьных строк, то <выражение, вырабатывающее значение> () не должно включать никаких операторов. Типом данных результата является тип символьных строк.

  • Если тип данных обоих операндов оператора является типом точных чисел, то тип данных результата является типом точных чисел с точностью и масштабом, определяемыми следующим образом:

    a) Пусть s1 и s2 - масштабы первого и второго операндов, соответственно.

    b) Точность результата сложения и вычитания определяется в реализации, и масштаб есть max(s1,s2).

    c) Точность результата умножения определяется в реализации, и масштаб есть s1+s2.

    d) Точность и масштаб результата деления определяются в реализации.

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

  • Общие правила
  • Если значение <первичного выражения> () является неопределенным значением, то результатом <выражения, вырабатывающего значение> () является неопределенное значение.


  • Если операторы не указаны, то результатом <выражения, вырабатывающего значение> () является значение указанного <первичного выражения> ().


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


  • Одноместные арифметические операторы + и - специфицируют одноместный плюс и одноместный минус, соответственно. Одноместный плюс не изменяет своего операнда. Одноместный минус изменяет знак своего операнда.


  • Двухместные арифметические операторы +, -, * и / специфицируют сложение, вычитание, умножение и деление соответственно. Делитель не должен быть равен 0.


  • Если типом результата арифметического оператора является тип целых чисел, то:

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

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


  • Первыми вычисляются выражения в скобках. Когда порядок вычисления не определяется скобками, одноместные операторы применяются перед операторами умножения и деления, операторы умножения и деления применяются перед операторами сложения и вычитания, и операторы одного уровня предшествования применяются слева направо.


  • <Предикат between> ()

    Функция
    Специфицирует сравнение с интервалом.
    Формат
    ::=

    [NOT] BETWEEN AND
    Синтаксические правила
  • Типы данных всех трех <выражений, вырабатывающих значение> () должны быть сравнимыми.

  • Общие правила
  • Пусть x, y и z обозначают результаты первого, второго и третьего <выражений, вырабатывающих значение> (), соответственно.

  • Результат "x BETWEEN y AND z" тот же самый, что и результат "x >= y AND x <= z".

  • Результат "x NOT BETWEEN y AND z" тот же самый, что и результат "NOT (x BETWEEN y AND z)".


  • <Предикат exists> ()

    Функция
    Специфицирует проверку множества на пустоту.
    Формат
    ::=
    EXISTS
    Синтаксические правила
    Нет.
    Общие правила
  • Пусть S обозначает результат <подзапроса> ().

  • Результатом "EXISTS S" является либо true, либо false.

  • Результатом "EXISTS S" является true, если и только если S не пусто.


  • <Предикат in> ()

    Функция
    Специфицирует сравнение с квантором.
    Формат
    ::=
    [NOT] IN
    { | () }
    ::=

    { , }...
    Синтаксические правила
  • Типы данных первого <выражения, вырабатывающего значение> () и <подзапроса> () или всех <выражений, вырабатывающих значение> () в <списке значений in> () должны быть сравнимыми.

  • Общие правила
  • Пусть x обозначает результат <выражения, вырабатывающего значение> (). Пусть S обозначает результат <подзапроса> () как в <предикате с квантором> () или значения, определенные через <список значений in> (), рассматриваемые как значения строк единственного столбца таблицы степени один.

  • Результат "x IN S" тот же самый, что и результат "x = ANY S". Результат "x NOT IN S" тот же самый, что и результат "NOT (x IN S)".


  • <Предикат like> ()

    Функция
    Специфицирует сравнение по совпадению с образцом.
    Формат
    ::=
    [NOT] LIKE
    [ESCAPE ]
    ::=

    ::=

    Синтаксические правила
  • <Спецификация столбца> () должна указывать на столбец символьных строк.

  • Тип данных <образца> () должен быть типом символьных строк.

  • Тип данных <символа escape> () должен быть типом символьных строк длины 1.

  • Общие правила
  • Пусть x обозначает значение, указываемое <спецификацией столбца> (), и пусть y обозначает результат <спецификации значения> () <образца> ().

  • Тогда:

    a) Если указывается <символ escape> (), то:

    i) Пусть z обозначает результат <спецификации значения> () <символа escape> ().

    ii) Должно существовать разбиение строки y на подстроки такое, что каждая подстрока имеет длину 1 или 2, никакая подстрока длины 1 не содержит символа escape z, и каждая подстрока длины 2 начинается с символа escape z, за которым следует либо символ escape z, либо символ подчеркивания, либо символ знака процента. В этом разбиении y каждая подстрока длины 2 представляет одно вхождение второго символа этой подстроки. Каждая подстрока длины 1, содержащая символ подчеркивания, представляет спецификатор произвольного символа. Каждая подстрока длины 1, содержащая знак процента, представляет спецификатор произвольной строки. Каждая подстрока длины 1, не содержащая ни символа подчеркивания, ни символа знака процента, представляет символ, который она содержит.

    b) Если <символ escape> () не указан, то каждый символ подчеркивания в y представляет спецификатор произвольного символа, каждый символ знака процента в y представляет спецификатор произвольной строки, и каждый символ в y, который не является ни символом подчеркивания, ни символом знака процента, представляет сам этот символ.


  • Строка y является последовательностью минимального числа спецификаторов подстрок таких, что каждый <символ> () y является частью в точности одного спецификатора подстроки. Спецификатор подстроки - это спецификатор произвольного символа, спецификатор произвольной подстроки или любая последовательность <символов> (), не являющаяся спецификатором произвольного символа или спецификатором произвольной строки.


  • Результатом "x LIKE y" является unknown, если x или y представляют неопределенное значение. Если x и y представляют не неопределенные значения, то значением "x LIKE y" является либо true, либо false.


  • Результатом "x LIKE y" является true, если существует разбиение x на подстроки такое, что:

    a) Подстрока x является последовательностью нуля или более подряд идущих <символов> () x, и каждый <символ> () x есть часть в точности одной подстроки.

    b) Если i-ый спецификатор подстроки y является спецификатором произвольного символа, i-ая подстрока x состоит из одного произвольного <символа> ().

    c) Если i-ый спецификатор подстроки y является спецификатором произвольной строки, i-ая подстрока x является произвольной последовательностью нуля или более <символов> ().

    d) Если i-ый спецификатор подстроки y не является ни спецификатором произвольного символа, ни спецификатором произвольной строки, i-ая подстрока x совпадает с этим спецификатором подстроки и имеет ту же длину, что этот спецификатор подстроки.

    e) Число подстрок x равно числу спецификаторов подстрок y.


  • Результат "x NOT LIKE y" такой же, как результат "NOT (x LIKE y)".


  • <Предикат null> ()

    Функция
    Специфицирует проверку значения на неопределенность.
    Формат
    ::=
    IS [NOT] NULL
    Синтаксические правила
    Нет.
    Общие правила
  • Пусть x обозначает значение, указываемое <спецификацией столбца> ().

  • Результатом "x IS NULL" является true или false.

  • Результатом "x IS NULL" является true, если и только если x представляет неопределенное значение.

  • Результат "x IS NOT NULL" такой же, как результат "NOT (x IS NULL)".


  • <Предикат с квантором> ()

    Функция
    Специфицирует сравнение с квантором.
    Формат
    ::=


    ::=
    |
    ::= ALL
    ::= SOME | ANY
    Синтаксические правила
  • Типы данных <выражения, вырабатывающего значение> () и <подзапроса> () должны быть сравнимы.

  • Общие правила
  • Пусть x обозначает результат <выражения, вырабатывающего значение> () и пусть S обозначает результат <подзапроса> ().

  • Результат "x S" вырабатывается путем применения подразумеваемого <предиката сравнения> () "x s" к каждому значению S:

    a) Если S пусто или если значение подразумеваемого <предиката сравнения> () равно true для каждого значения s в S, то значение "x S" есть true.

    b) Если значение подразумеваемого <предиката сравнения> () равно false хотя бы для одного значения s в S, то значение "x S" есть false.

    c) Если значение подразумеваемого <предиката сравнения> () равно true хотя бы для одного значения s в S, то значение "x S" есть true.

    d) Если S пусто или если значение подразумеваемого <предиката сравнения> () равно false для каждого значения s в S, то значение "x S" есть false.

    e) Если результатом "x S" не является ни true, ни false, то результатом является unknown.


  • <Раздел from> ()

    Функция
    Специфицирует таблицу, порожденную из одной или более именованных таблиц.
    Формат
    ::=
    FROM
    [{,
    }...]
    ::=
    []
    Синтаксические правила
  • <Имя таблицы> (
  • ), специфицируемое в <ссылке на таблицу> (
    ), экспонируется в <разделе from> () тогда и только тогда, когда эта <ссылка на таблицу> не специфицирует <имя кореляции> ().
  • <Имя таблицы> (
  • ), которое экспонируется в <разделе from> (), не должно совпадать ни с каким другим <именем таблицы> (
    ), становящимся видимым за пределами этого <раздела from> ().
  • <Имя кореляции> (), специфицированное в <ссылке на таблицу> (
  • ), не должно совпадать ни с каким другим <именем кореляции> (), специфицированным в содержащем <разделе from> (), и не должно совпадать с <идентификатором таблицы> (
    ) какого-либо <имени таблицы> (
    ), экспонирующегося в содержащем <разделе from> ().
  • Областью действия <имен кореляции> () и экспонируемых <имен таблиц> (
  • ) является наиболее внутренний <подзапрос> (), <спецификация запроса> () или <оператор выборки> (
    ), в котором содержится данный <раздел from> (). <Имя таблицы> (
    ), которое специфицировано в <разделе from> (), имеет область действия, определенную этим <разделом from> (), если и только если это <имя таблицы> (
    ) экспонируется в этом <разделе from> ().

  • Если таблица, идентифицируемая <именем таблицы> (
  • ) является сгруппированным представлением, то <раздел from> () должен содержать в точности одну <ссылку на таблицу> (
    ).

    a) Если <раздел from> () содержит единственное <имя таблицы> (
    ), то описание результата <раздела from> () такое же, как описание таблицы, идентифицируемой этим <именем таблицы> (
    ).

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

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

  • Спецификация <имени кореляции> () или экспонируемого <имени таблицы> (
  • ) в <ссылке на таблицу> (
    ) определяет это <имя кореляции> () или экспонируемое <имя таблицы> (
    ) как обозначатель таблицы, идентифицируемой <именем таблицы> (
    ) этой <ссылки на таблицу> (
    ).

    a) Если <раздел from> () содержит одно <имя таблицы> (
    ), то результатом <раздела from> () является таблица, идентифицируемая этим <именем таблицы> (
    ).

    b) Если <раздел from> () содержит более одного <имени таблицы> (
    ), то результатом <раздела from> () является расширенное прямое произведение таблиц, идентифицируемых этими <именами таблиц> (
    ). Расширенное прямое произведение R есть мультимножество всех строк r таких, что r является конкатенацией строк из всех идентифицированных таблиц в том порядке, в котором они идентифицировались. Мощность R есть произведение мощностей идентифицированных таблиц. Порядковая позиция столбца в R есть n + s, где n порядковая позиция порождающего столбца в именованной таблице T, и s есть сумма степеней всех таблиц, идентифицированных до T в <разделе from> ().

    <Раздел group by> ()

    Функция
    Специфицирует сгруппированную таблицу, порождаемую применением <раздела group by> () к результату предыдущего раздела.
    Формат
    ::=
    GROUP BY
    [{ , }...]
    Синтаксические правила
  • Пусть T обозначает описание результата предшествующего <раздела from> () или <раздела where> ().

  • Каждая <спецификация столбца> () в <разделе group by> () должна недвусмысленно ссылаться на столбец T. Столбец, указываемый в <разделе group by> (), есть столбец группирования.

  • Общие правила
  • Пусть R обозначает результат предыдущего <раздела from> () или <раздела where> ().

  • Результатом <раздела group by> () является разбиение R на множество групп. Это множество состоит из минимального числа групп таких, что для каждого столбца группирования каждой группы, включающей более одной строки, все значения этого столбца группирования равны.

  • Каждая строка данной группы содержит одно и то же значение данного столбца группирования. Когда <условие поиска> () применяется к группе, ссылка на столбец группирования является ссылкой на это значение.


  • <Раздел having> ()

    Функция
    Специфицирует ограничение на сгруппированную таблицу, являющуюся результатом предыдущего <раздела group by> () или <раздела from> (), путем исключения групп, не удовлетворяющих <условию поиска> ().
    Формат
    ::=
    HAVING
    Синтаксические правила
  • Пусть T обозначает описание результат предшествующего <раздела from> (), <раздела where> () или <раздела group by> (). Каждая <спецификация столбца> (), непосредственно содержащаяся в <условии поиска> (), должна недвусмысленно указывать на столбец группирования T или являться внешней ссылкой.

    Замечание: "Внешняя ссылка" определяется в , "<спецификация столбца> ()" .

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

  • Общие правила
  • Пусть R обозначает результат предшествующего <раздела from> (), <раздела where> () или <раздела group by> (). Если этот раздел не есть <раздел group by> (), то R состоит из одной группы и не обладает столбцом групирования.

  • <Условие поиска> () прмменяется к каждой группе R. Результат <раздела having> () является сгруппированной таблицей, содержащей те группы из R, для которых результат <условия поиска> () есть true.

  • Когда <условие поиска> () применяется к данной группе R, эта группа является аргументом или источником аргумента каждой <спецификации функции над множеством> (), прямо содержащейся в <условии поиска> (), если только <спецификация столбца> () в <спецификации функции над множеством> () не является внешней ссылкой.

    Замечание: "Внешняя ссылка" определяется в , "<спецификация столбца> ()".

  • Каждый <подзапрос> () в <условии поиска> () фактически вычисляется для каждой группы R и результат используется при применении <условия поиска> () к данной группе R. Если какой-либо <подзапрос> () содержит внешнюю ссылку на столбец R, то эта ссылка указывает на значения этого столбца в данной группе R.

    Замечание: "Внешняя ссылка" определяется в 5.7, "<спецификация столбца> ()".

  • | |

    <Раздел where> ()

    Функция
    Специфицирует таблицу, получаемую применением <условия поиска> () к результату прешествующего <раздела from> ().
    Формат
    ::=
    WHERE
    Синтаксические правила
  • Пусть T обозначает описание результата предшествующего <раздела from> (). Каждая <спецификация столбца> (), прямо содержащаяся в <условии поиска> (), должна однозначно ссылаться на столбец T или являться внешней ссылкой.

    Замечание: "Внешняя ссылка" определяется в , "<спецификация столбца> ()" .

  • <Выражение, вырабатывающее значение> (), прямо содержащееся в <условии поиска> (), не должно включать ссылку на столбец, порождаемый функцией.

  • Если <выражение, вырабатывающее значение> (), прямо содержащееся в <условии поиска> (), является <спецификацией функции над множеством> (), то <раздел where> () должен содержаться в <разделе having> (), и <спецификация столбца> () в <спецификации функции над множеством> () не должна являться внешней ссылкой.

    Замечание: "Внешняя ссылка" определяется в , "<спецификация столбца> ()" .

  • Общие правила
  • Пусть R обозначает результат <раздела from> ().

  • <Условие поиска> () применяется к каждой строке R. Результатом <раздела where> () является таблица из тех строк R, для которых результат <условия поиска> () есть true.

  • Каждый <подзапрос> () в <условии поиска> () фактически выполняется для каждой строки R, и результаты используются при применении <условия поиска> () к данной строке R. Если некоторый <подзапрос> () содержит внешнюю ссылку на столбец R, то эта ссылка указывает на значение этого столбца в данной строке R.

    Замечание: "Внешняя ссылка" определяется в , "<спецификация столбца> ()" .


  • <Условие поиска> ()

    Функция
    Специфицирует условие, которое может быть "true", "false" или "unknown" в зависимости от результата применения булевских операторов к указанным условиям.
    Формат
    ::=

    | OR
    ::=

    | AND
    ::=
    [NOT]
    ::=
    | ()
    Синтаксические правила
  • <Спецификация столбца> () или <выражение, вырабатывающее значение> (), указанные в <условии поиска> (), непосредственно содержатся в этом <условии поиска> (), если <спецификация столбца> () или <выражение, вырабатывающее значение> () не указываются внутри <спецификации функции над множеством> () или <подзапроса> () этого <условия поиска> ().

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

  • NOT(true) есть false, NOT(false) есть true и NOT(unknown) есть unknown. AND и OR определяются следующими таблицами истинности:
    ЪДДДДДДДДВДДДДДДДДВДДДДДДДДВДДДДДДДї
    іAND іtrue іfalse іunknownі
    ГДДДДДДДДЕДДДДДДДДЕДДДДДДДДЕДДДДДДДґ
    іtrue іtrue іfalse іunknownі
    ГДДДДДДДДЕДДДДДДДДЕДДДДДДДДЕДДДДДДДґ
    іfalse іfalse іfalse іfalse і
    ГДДДДДДДДЕДДДДДДДДЕДДДДДДДДЕДДДДДДДґ
    іunknown іunknown іfalse іunknownі

    АДДДДДДДДБДДДДДДДДБДДДДДДДДБДДДДДДДЩ

    ЪДДДДДДДДВДДДДДДДДВДДДДДДДДВДДДДДДДї

    іOR іtrue іfalse іunknownі

    ГДДДДДДДДЕДДДДДДДДЕДДДДДДДДЕДДДДДДДґ

    іtrue іtrue іtrue іtrue і

    ГДДДДДДДДЕДДДДДДДДЕДДДДДДДДЕДДДДДДДґ

    іfalse іtrue іfalse іunknownі

    ГДДДДДДДДЕДДДДДДДДЕДДДДДДДДЕДДДДДДДґ

    іunknown іtrue іunknown іunknownі

    АДДДДДДДДБДДДДДДДДБДДДДДДДДБДДДДДДДЩ


  • Сначала вычисляются выражения в скобках. Когда порядок вычисления не определяется скобками, NOT применяется перед AND, AND применяется перед OR, и операторы с одинаковым уровнем предшествования применяются слева направо.


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


  • <Выражение, вырабатывающее таблицу> (

    )Функция
    Специфицирует таблицу или сгруппированную таблицу.
    Формат
    ::=

    []
    []
    []
    Синтаксические правила
  • Если таблица, идентифицируемая в <разделе from> (), является сгруппированным представлением, то <выражение, вырабатывающее таблицу> (
  • ) не должно содержать <раздела where> (), <раздела group by> () или <раздела having> ().
    Общие правила
  • Если все необязательные разделы опущены, то результирующая таблица является результатом <раздела from> (). В противном случае каждый указанный раздел применяется к результату раздела, указанного перед ним, и результирующая таблица является результатом применения последнего указанного раздела. Результатом <выражения, вырабатывающее таблицу> (
  • ) является порожденная таблица, в которой i-ый столбец наследует описание i-ого столбца таблицы, специфицированной через <раздел from> ().

    Формат

    ::=
    CREATE TABLE

    (
    [{,
    }...])
    ::=

    |


    Формат

    ::=

    []
    [...]
    ::=
    NOT NULL []
    |
    | CHECK ()

    Формат

    ::=
    (SELECT [ALL | DISTINCT]
    )
    ::=

    | *

    Формат

    ::=
    (SELECT [ALL | DISTINCT]
    )

    |
    |

    Функция

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

    Функция

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

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

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

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

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

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

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


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

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

  • Если R не является сгруппированной таблицей и <список выборки> (
  • ) содержит <идентификатор полномочий> (), то этот <идентификатор полномочий> () должен быть таким же, как <идентификатор полномочий схемы> () содержащей схемы.
  • <Имя таблицы> (
  • ) должно быть отличным от <имени таблицы> (
    ) любого другого <определения таблицы> (
    ) или <определения представления> () содержащей <схемы> ().
  • <Определение таблицы> (
  • ) должно содержать по меньшей мере одно <определение столбца> ().
  • Областью действия <имени таблицы> (
  • ) является <определение таблицы> (
    ).
  • Описание таблицы, определенной через <определение таблицы> (
  • ) включает имя <имя таблицы> (
    ) и описание столбцов, специфицированное каждым <определением столбца> (. Описание i-го столбца предоставляется i-ым <определением столбца> ().

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

  • <Имя столбца> () должно быть отличным от <имени столбца> () любого другого <определения столбца> () содержащегося в <определении таблицы> (
  • ).
  • I-ый столбец таблицы описывается i-ым <определением столбца> () в <определении таблицы> (
  • ). Имя и тип данных столбца определяются <именем столбца> () и <типом данных> () соответственно.
  • Пусть C обозначает <имя столбца> () в <определении столбца> ().

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

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

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

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

  • Если указана <спецификация ссылок> (), то неявно вводится следующее <определение ограничения ссылок> ():
    FOREIGN KEY(C)

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

  • Если указано CHECK, то каждая <спецификация столбца> () в <условии поиска> () должна ссылаться на столбец C, и неявно вводится следующее <определение проверочного ограничения> ( CHECK ()

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


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

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

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

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

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

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


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

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

    Замечание: "Применимые <привилегии> ()" для <имени таблицы> (
    ) определяются в , "<определение привилегий> ()".
  • Пусть R обозначает результат <выражения, вырабатывающего таблицу> (
  • ).
  • Степень таблицы, специфицированной через <спецификацию запроса> () равна мощности <списка выборки> () "*" эквивалентен последовательности <выражений, вырабатывающих значение> (), в которой каждое <выражение, вырабатывающее значение> () является <спецификацией столбца> (), указывающей на столбец R, и каждый столбец R указывается ровно один раз. Столбцы указываются в порядке возрастания номеров их исходных позиций внутри R.

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

  • Если R - это сгруппированное представление, то <список выборки> (
  • ::=

    |
    |

    Формат

    ::=
    ()
    ::=
    UNIQUE | PRIMARY KEY
    ::=
    [{,}...]

    Формат

    ::=
    FOREIGN KEY ()

    ::=
    REFERENCES
    ::=

    ::=
    [()]
    ::=
    [{,}...]

    Формат

    ::=
    CHECK ()

    Формат

    ::=
    CREATE VIEW
    [()]
    AS
    [WITH CHECK OPTION]
    ::=
    [{,}...]

    Формат

    ::=
    GRANT ON

    TO [{,}...]
    [WITH GRANT OPTION]
    ::=
    ALL PRIVILEGES
    | [{,}...]
    ::=
    SELECT | INSERT | DELETE
    | UPDATE [()]
    | REFERENCES [(]
    ::=
    [{,}...]
    ::=
    PUBLIC |

    Функция

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

    Функция

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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


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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

  • Пусть термин "ссылающаяся таблица" обозначает таблицу, для которой определяется ограничение. Пусть термин "ссылаемая таблица" обозначает таблицу, идентифицируемую <именем таблицы> (
  • ) в <ссылаемых таблице и столбцах> (). Пусть термин "ссылающиеся столбцы" обозначает столбцы, идентифицируемые <списком столбцов ссылки> () в <ссылающихся столбцах> ().

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

    b) Если в <ссылаемых таблице и столбцах> () не указывается <имя столбца> () или <список столбцов ссылки> (), то <определение таблицы> (
    ) для ссылаемой таблицы должно содержать <определение ограничения уникальности> (), специфицирующее PRIMARY KEY. Пусть термин "ссылаемые столбцы" обозначает столбцы, идентифицируемые <списком столбцов уникальности> () в этом <определении ограничения уникальности> ().
  • Применимые <привилегии> () для <имени таблицы> (
  • ) должны включать REFERENCES для каждого ссылаемого столбца.

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

  • <Условие поиска> () не должно содержать <подзапроса> (), <спецификации функции над множеством> () или <спецификации цели> ().

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

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

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

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

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

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

  • Описание таблицы, определенной через <определение представления> (), включает имя <имя таблицы> (
  • ) и описания столбцов таблицы, специфицированной через <спецификацию запроса> (). Если указывается <список столбцов представления> (), то имя i-ого столбца есть i-ое <имя столбца> () в этом <списке столбцов представления> ().
  • Если <спецификация запроса> () содержит <раздел group by> () или <раздел having> (), не содержащиеся в <подзапросе> (), то представляемая таблица, определенная через данное <определение представления> (), является сгруппированной таблицей.

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


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

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

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

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

    a)

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

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

    Формат

    ::=



    [...]
    < procedure > ...
    ::=
    LANGUAGE { COBOL | FORTRAN | PASCAL | PLI }
    ::=
    AUTHORIZATION
    ::=


    Формат

    ::=
    MODULE []

    Формат

    ::=
    PROCEDURE
    ...;
    ;
    ::=

    |
    ::=
    SQLCODE
    ::=

    |
    |
    |
    |
    |
    |
    |
    | ), результатом которого явилась пустая таблица, то в параметр SQLCODE устанавливается значение 100.

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

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

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

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

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

    | |

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

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

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


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

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


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

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

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

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

  • Если <имя столбца> () в <операторе SQL> () совпадает с <именем параметра> () в <объявлении параметра> () <процедуры> (), содержащей этот <оператор SQL> (), то <спецификация столбца> (), которая содержит это <имя столбца> (), должна содержать <квалификатор> ().

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

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

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


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

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

    Формат

    ::=
    CLOSE

    Формат

    ::=
    COMMIT WORK

    Формат

    ::=
    DECLARE CURSOR
    FOR
    ::=
    [...]
    ::=

    | UNION [ALL]
    ::=
    | ()
    ::=
    ORDER BY
    [{,}...]
    ::=
    { | }
    [ASC | DESC]

    Формат

    ::=
    DELETE FROM

    WHERE CURRENT OF

    Формат

    ::=
    DELETE FROM

    WHERE []

    Формат

    ::=
    FETCH INTO
    ::=
    [{,}...]

    Функция

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

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

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

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


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

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

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

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


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

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

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


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

    а) Если не указано <условие поиска> (), то удаляются все строки таблицы Т.

    б) Если указано <условие поиска> (), то условие применяется к каждой строке Т с <именем таблицы> (
    ), связанным с этой строкой, и все строки, для которых результат <условия поиска> () есть true, удаляются. Каждый <подзапрос> () в <условии поиска> () реально выполняется для каждой строки T и результаты используются в применении <условия поиска> () к данной строке Т. Если любой выполняемый <подзапрос> () содержит внешнюю ссылку на столбец Т, то эта ссылка указывает на значение этого столбца в данной строке Т.

    Замечание: "Внешняя ссылка" определяется в , "<спецификация столбца> ()".

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

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

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

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

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

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

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

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

  • Если v - это неопределенное значение, то для V должен быть специфицирован индикатор, и этот индикатор устанавливается в -1. Если v - не неопределенное значение, и V обладает индикатором, то:

    a) Если тип данных V есть тип символьных строк длины L и длина M v больше L, то индикатор получает значение M.

    b) Иначе значение индикатора устанавливается в 0.

  • Цель, идентифицированная i-той <спецификацией цели> () из <списка целей чтения> (), соответствует 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.
    | |

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

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


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

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

  • Любое <имя параметра> (), содержащееся в <спецификации курсора> (), должно быть определено в <объявлении параметра> () <процедуры> () объемлющего <модуля> (), который содержит <оператор открытия> (), специфицирующий это <имя курсора> ().

    Замечание: Cм. Синтаксическое правило 7.1, "<модуль> ()".

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


  • a) Если указано ORDER BY, то Т является только читаемой таблицей со специфицированным порядком сортировки.

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

    c) Иначе Т - только читаемая таблица.

    a) Если не указано UNION, то описанием Т является описание <спецификации запроса> ().

    b) Если указано UNION, то пусть для каждого специфицированного UNION Т1 и Т2 обозначают таблицы, которые специфицированы в <выражении запроса> () и <терме запроса> (). <Список выборки> (
    ) должны включать DELETE.

    Замечание: "Применимые <привилегии> ()" для <имени таблицы> (
    ) определяются в , "<Определение привилегий> ().
  • Содержащий <модуль> () должен содержать <объявление курсора> () CR с тем же <именем курсора> (), что и <имя курсора> () в <операторе удаления: позиционном> ().

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

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

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

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

    Замечание: Применимые <привилегии> () для <имени таблицы> (
    ) определяются в , "<определение привилегий> ()".
  • Пусть Т обозначает таблицу, идентифицируемую <именем таблицы> (
  • ). Т не должна быть только читаемой таблицей или таблицей, которая идентифицируется в <разделе from> () любого <подзапроса> (), содержащегося в <условии поиска> ().
  • Область действия <имени таблицы> (
  • ) - целиком <оператор удаления: поисковый> (.

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

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

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


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

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

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

    Формат

    ::=
    INSERT INTO
    [()]
    {VALUES ()|}
    ::=
    [{,}...]
    ::=
    [{,...]
    ::=
    | NULL

    Формат

    ::=
    OPEN

    Формат

    ::=
    ROLLBACK WORK

    Формат


    INTO


    SET
    [{,}...]
    WHERE CURRENT OF
    ::=
    =
    { | NULL }
    ::=

    Формат

    ::=
    UPDATE

    SET
    [{,}...]
    [WHERE ]
    ::=
    =
    { | NULL }
    ::=

    Функция

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

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

  • Строка вставляется по следующим шагам:

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

    b) Для каждого объектного столбца в возможной строке его значение заменяется на вставляемое значение.

    c) Возможная строка вставляется в таблицу В.

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

  • Если указывается <список вставляемых значений> (), то:

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

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

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


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

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

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

  • Курсор CR переводится в открытое состояние следующими шагами:

    а) Фактически создается копия S, в которой каждая <спецификация цели> () заменяется на значение идентифицируемой цели.

    b) Если S специфицирует только читаемую таблицу, то эта таблица фактически создается в соответствии со спецификацией - копией S.

    c) Курсор CR переводится в открытое состояние и его позиция устанавливается перед первой строкой таблицы.


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

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

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

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


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

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

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

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

  • Цель, идентифицированная i-той <спецификацией цели> () из <списка целей выборки> (
  • ), связанным с этой строкой, и объектными строками являются все строки, для которых результат <условия поиска> () есть true. Каждый <подзапрос> () в <условии поиска> () фактически выполняется для каждой строки T, и результат используется при применении <условия поиска> () к данной строке Т. Если какой-либо выполняемый <подзапрос> () содержит внешнюю ссылку на столец Т, то она указывает на значение этого столбца в данной строке Т.

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

    а) Создается возможная строка, которая является копией объектной строки.

    b) Для каждого <раздела установки: поисковой> () значение указанного объектного столбца в возможной строке заменяется на специфицированное значение модификации.

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

  • Применимые <привилегии> () к <имени таблицы> (
  • ) должны включать INSERT.

    Замечание: Применимые <привилегии> () для <имени таблицы> (
    ) определяются в , "<определение привилегий> ()".
  • Пусть Т обозначает таблицу, идентифицируемую <именем таблицы> (
  • ). Т не должна быть только читаемой таблицей или таблицей, которая идентифицируется в <разделе from> () <спецификации запроса> () или какого-либо <подзапроса> (), содержащегося в <спецификации запроса> ().
  • Каждое <имя столбца> () в <списке столбцов вставки> () должно идентифицировать столбец Т, и один и тот же столбец не должен быть идентифицирован более одного раза. Отсутствие <списка столбцов вставки> () является неявной спецификацией <списка столбцов вставки> (), который идентифицирует все столбцы Т в порядке возрастания их порядковых позиций внутри Т.

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


  • а) Если указывается <список вставляемых значений> (), то число <вставляемых значений> () в этом <списке вставляемых значений> () должно быть равно числу <имен столбцов> () в <списке вставляемых столбцов> (). Пусть i-ый элемент <оператора вставки> () указывает на i-ую <спецификацию значения> () в этом <списке вставляемых значений> ().

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

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

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


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

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

    Замечание: Применимые <привилегии> () для <имени таблицы> (
    ) определяются в , "<определение привилегий> ()".
  • <Выражение, <вырабатывающее таблицу> (
  • ) не должно включать <раздел group by> () или <раздел having> и не должно идентифицировать сгруппированное представление.
  • Число элементов в <списке выборки> ().


  • а) Если тип данных цели, указанной i-ой <спецификацией цели> () в <списке целей выборки> () должен быть типом символьных строк.

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

    c) Если тип данных цели, указанной i-ой <спецификацией цели> () в <списке целей выборки> () должен быть типом приблизительных чисел.
  • Пусть S обозначает <спецификацию запроса> () с теми же <списком выборки> (
  • ), какие указаны в <операторе выборки> (). S должна быть допустимой <спецификацией запроса> ().

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

  • "Применимые <привилегии> ()" к <имени таблицы> (
  • ) должны включать привилегию UPDATE для каждого <объектного столбца: позиционного> ().

    Замечание: "Применимые <привилегии> ()" для <имени таблицы> (
    ) определяются в , "<определение привилегий> ()".
  • Содержащий <модуль> () должен содержать <объявление курсора> () CR с тем же <именем курсора> (), что и <имя курсора> () в <операторе модификации: позиционном> ().

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

  • Пусть Т обозначает таблицу, идентифицируемую <именем таблицы> (
  • ). Т должна быть таблицей, идентифицированной в первом <разделе from> () <спецификации курсора> () CR.
  • <Выражение, вырабатывающее значение> () в <разделе установки: позиционной> () не должно включать <спецификацию функции над множеством> ().

  • Каждое <имя столбца> (), специфицированное как <объектный столбец: позиционный> (), должно идентифицировать столбец T. Один <объектный столбец: позиционный> () не должен появляться более одного раза в <операторе модификации: позиционном> ().
  • Область действия <имени таблицы> (
  • ) - целиком весь оператор <модификации: позиционный> ().
  • Для каждого <раздела установки: позиционного> ():

    а) Если специфицировано неопределенное значение, то для столбца, указанного <объектным столбцом: позиционным> (), должно до пускаться неопределенное значение.

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

  • "Применимые <привилегии> ()" для <имени таблицы> (
  • ) должны включать UPDATE для каждого <имени столбца: поискового> ().

    Замечание: Применимые <привилегии> () для <имени таблицы> (
    ) определяются в , "<определение привилегий> ()".
  • Пусть Т обозначает таблицу, идентифицируемую <именем таблицы> (
  • ). Т не должна быть только читаемой таблицей или таблицей, которая идентифицируется в <разделе from> () любого <подзапроса> (), содержащегося в <условии поиска> ().
  • <Выражение, вырабатывающее значение> () в <разделе установки: поисковой> () не должно включать <спецификацию функции над множеством> ().

  • Каждое <имя столбца> (), специфицированное как <объектный столбец: поисковый> (), должно идентифицировать столбец T. Один <объектный столбец: поисковый> () не должен появляться более одного раза в <операторе модификации: поисковом> ().
  • Область действия <имени таблицы> (
  • ) - целиком <оператор модификации: поисковый> (.
  • Для каждого <раздела установки: поискового> ():

    а) Если специфицировано неопределенное значение, то для столбца, указанного <объектным столбцом: поисковым> (), должно допускаться неопределенное значение.

    b) Если тип данных столбца, указанного <объектным столбцом: поисковым> (), является типом символьных строк длины L, то тип данных <выражения, вырабатывающего значение> () должен быть типом символьных строк с длиной меньшей или равной L.

    c) Если тип данных столбца, указанного <объектным столбцом: поисковым> (), является типом точных чисел, то тип данных <выражения, вырабатывающего значение> () должен быть типом точных чисел.

    d) Если тип данных столбца, указанного <объектным столбцом: поисковым> (), является типом приблизительных чисел, то тип данных <выражения, вырабатывающего значение> () должен быть типом приблизительных чисел или типом точных чисел.

    Уровни

    Этот стандарт специфицирует два уровня и отдельные средства поддержания целостности данных.
    Средства поддержания целостности данных образуют следующие синтаксические конструкции вместе с Синтаксическими правилами и Общими правилами:
  • <Раздел умолчаний> ()

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

  • все опции <определения ограничения на таблицу> (
  • ), кроме опции UNIQUE <список столбцов уникальности> (UNIQUE ()).
  • <действие> REFERENCES <список столбцов передачи> ( REFERENCES [ ()])

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

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

    b) Параграф 2 удаляется.

    c) Второе предложение параграфа 3 удаляется.

  • , "Лексемы ():

    <Идентификатор> () не должен состоять более чем из 12 символов.

  • , "Имена":

    <Имя таблицы> (
  • ) не должно содержать <идентификатор полномочий> ().
  • , "<Спецификация значения> () и <спецификация цели> ()":

    а) <Спецификация значения> () не должна содержать USER.

    b) <Спецификация параметра> () не должна специфицировать <парамететр-индикатор> ().

    c) <Спецификация переменной> () не должна специфицировать <переменную-индикатор> ().


  • , "<Спецификация столбца> ()" :

    К синтаксическому правилу 4 добавляется следующее:

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



  • , "<Спецификация функции над множеством> ()" , <Подзапрос> (), и , ():

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

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


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

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



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


  • , "<предикат like> ():

    а) <Предикат like> () не должен специфицировать ESCAPE <символ escape> ().

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

    Замечание: на уровне 1 <предикат like> (), содержащий NOT, может быть выражен в эквивалентной форме <условия поиска> (): "NOT ".


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

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



  • , "<раздел group by>" ()":

    Следующее предложение добавляется к Общему правилу 2:


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



  • , "<Спецификация запроса> ()":

    Синтаксическое правило 11 заменяется на следующее:

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



  • , "<Схема> ()":

    <Схема> () не должна специфицироваться.

    Уровень 1 реализации должен обеспечивать некоторый механизм связи <идентификатора полномочий> () с <определением таблицы> (
  • ), <определением представления> () или <определением привилегий> ().

  • , "<Определение таблицы> (
  • )":

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

  • , "<Определение столбцов> ():

    а) <Тип данных> () в <определении столбца> () не должен включать REAL, DOUBLE, PRECISION и NUMERIC.

    b) <Определение столбца> () столбца не должно специфицировать NOT NULL.

    c) <Определение столбца> () столбца не должно специфицировать UNIQUE.


  • , "<Определение представления> ():

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


  • , "<Определение привилегий> ()" :

    <Определение привилегий> () не должно содержать WITH GRANT OPTION.


  • , "<Процедура> ():


    а) Cинтаксическое правило 8 (a) (2) заменяется на следующее:

    Любой <тип данных> () в <объявлении параметра> () должен специфицировать тип CHARACTER.

    b) В общем правиле 3 случай (a) каждое вхождение числа "100" заменяется на слова " положительное число со значением, определяемым реализацией"

    c) Общее правило 3 (b) (1) заменяется на следующее:

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


  • , "<Объявление курсора> ()":

    а) <Спецификация сортировки> () не должна содержать <целых без знака> ().

    b) <Спецификация сортировки> () не должна содержать ASC.

    Замечание: на уровне 1 порядок по возрастанию специфицируется отсутствием опции DESC.

    c) <Выражение запроса> () не должно содержать UNION.

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


  • , "<Оператор вставки> () :

    <Оператор вставки> () не должен содержать <спецификацию запроса> ().


  • , "<Оператор модификации: позиционный> ()" и <оператор удаления: поизиционный> ():

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


  • | |

    Формат

    ::=

    |
    |
    |
    ::=

    {
    |
    | }
    []
    ::=
    EXEC SQL
    ::=
    END EXEC | ;
    ::=

    [...]

    ::=
    BEGIN DECLARE SECTION
    []
    ::=
    END DECLARE SECTION
    []
    ::=
    < COBOL variable definition>
    | < FORTRAN variable definition>
    |
    |
    ::=
    :
    ::=
    < COBOL host identifier>
    | < FORTRAN host identifier>
    |
    |

    Функция

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

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

  • Интерпретация <программы со встроенным SQL> () H по определению эквивалентна интерпретации извлекаемой программы P и извлекаемого <модуля> () М из программы Н.

  • | |

    Приложения

    Приложение А. <Программа со встроенным SQL> ()

    (Это дополнение не является неотъемлемой частью стандарта.)

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

  • <Прикладная программа со встроенным SQL> () является прикладной программой, состоящей из текста на языке программирования и текста на SQL. Текст на языке программирования должен удовлетворять требованиям конкретного стандартного языка программирования. Текст на SQL должен состоять из одного или более <встроенных операторов SQL> () и, возможно, одной или более <секций объявления SQL> ().

  • <Встроенный оператор SQL> (), <объявление начала встроенного SQL> () или <объявление конца встроенного SQL> (), содержащиеся в <программе на языке COBOL со встроенным SQL> (), должны содержать <терминатор SQL> () END-EXEC. <Встроенный оператор SQL> (), <объявление начала встроенного SQL> () или <объявление конца встроенного SQL> (), содержащиеся в <программе на языке FORTRAN со встроенным SQL> (), не должны содержать <терминатор SQL> (). <Встроенный оператор SQL> (), <объявление начала встроенного SQL> () или <объявление конца встроенного SQL> (), содержащиеся в <программе на языке PL/1 со встроенным SQL> (), должны содержать <терминатор SQL> () - точку с запятой. В <программе на языке PASCAL со встроенным SQL> () <объявление начала встроенного SQL> () должно содержать <терминатор SQL> () - точку с запятой; <объявление конца встроенного SQL> () или <встроенный оператор SQL> (), непосредственно следующие за <<объявлением начала встроенного SQL> () или <встроенным оператором SQL> (), должны содержать <терминатор SQL> - точку с запятой; в остальных случаях <объявление конца встроенного SQL> () или <встроенный оператор SQL> () не должны содержать <терминатор SQL>, а должны заканчиваться в соответствии с правилами для операторов языка Pascal.


  • Формат

    ::=
    WHENEVER
    ::=
    SQLERROR | NOT FOUND
    ::=
    CONTINUE |
    ::=
    { GOTO | GO TO }
    ::= : |

    Формат

    ::=
    См. Синтаксические правила.
    ::=
    { 01 | 77 } < COBOL host identifier>

    [ ...]
    < COBOL host identifier> ::=
    См. Cинтаксическое правило 3.
    ::=

    |
    |
    ::=
    PIC[TURE] [IS] X ()
    ::=
    PIC[TURE] [IS]
    S{ [V]
    | V
    | V }
    [USAGE [IS]] DISPLAY SIGN LEADING SEPARATE
    ::=
    PIC[TURE] [IS]
    S
    [USAGE [IS]] COMP[UTATIONAL]
    ::= { 9 [()] }...

    Формат

    ::=
    См. Синтаксические правила.
    ::=


    [{,}...]
    ::=
    См. Синтаксическое правило 4.
    ::=
    CHARACTER [*]
    | INTEGER
    | REAL
    | DOUBLE PRECISION

    Формат

    ::=
    См. Синтаксические правила.
    ::=

    [{,}...]:

    < Pascal host identifier> ::=
    См. Синтаксическое правило 3.
    ::=
    PACKED ARRAY
    1.. OF CHAR
    | INTEGER
    | REAL
    ::=[
    ::=]

    Формат

    ::=
    См. Синтаксические правила.
    ::=
    { DCL | DECLARE }
    {
    | (
    [{, }...]) }

    [ ...];
    < PL/1 host identifier> ::=
    См. Синтаксическое правило 3.
    ::=
    CHAR[ACTER] ()
    | { DEC[IMAL] FIXED | FIXED DEC[IMAL] }
    ( [,])
    | { BIN[ARY] FIXED | FIXED BIN[ARY] }
    [()]
    | { BIN[ARY] FLOAT | FLOAT BIN[ARY] }
    ()

    Функция

    Специфицирует действия, предпринимаемые в случае возникновения исключительных ситуаций при выполнении <оператора SQL> ().

    Функция

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

    Функция

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

    Функция

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

    Функция

    Специфицирует модуль SQL, встроенный в программу на языке PL/1.

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

  • Непосредственно после выполнения <оператора SQL> () в <программе со встроенным SQL> ():

    а) Если значение переменной SQLCODE (SQLCOD) равно +100 и <программа со встроенным SQL> () содержит <встроенное объявление реакции на исключительную ситуацию> (), которое применимо к <оператору SQL> (), <условие> () которого есть NOT FOUND и <действие по исключительной ситуации> () которого есть <оператор передачи управления> (), то выполняется оператор GOTO основного языка с указанным в данном <операторе передачи управления> () <идентификатором основного языка> () или <целым числом без знака> ().

    b) Если значение переменной SQLCODE (SQLCOD> отрицательное число и <программа со встроенным SQL> () содержит <встроенное объявление реакции на исключительную ситуацию> (), которое применимо к <оператору SQL> (), <условие> () которого SQLERROR и <действие по исключительной ситуации> () которого есть <оператор передачи управления> (), то выполняется оператор GOTO основного языка с указанным в данном <операторе передачи управления> () <идентификатором основного языка> () или <целым числом без знака> ().

    c) Если <программа со встроенным SQL> () не содержит <встроенное объявление реакции на исключительную ситуацию> (), которое применимо к <оператору SQL> (), или если она содержит <встроенное объявление реакции на исключительную ситуацию> (), которое применимо к <оператору SQL> () и <условие> () которого CONTINUE, то никакие действия для этого <оператора SQL> () не выполняются.

  • Приложение С. <Программа на языке Кобол со встроенным SQL> (

    (Это дополнение не является неотъемлемой частью стандарта.)

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

    См. Приложение "<Программа со встроенным SQL> ()".
    Приложение D. <Программа на языке Фортран со встроенным SQL> ()

    (Это дополнение не является неотъемлемой частью стандарта.)

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

    См. Приложение "<Программа со встроенным SQL> ()".
    Приложение Е. <Программа на языке Паскаль со встроенным SQL> ()

    (Это дополнение не является неотъемлемой частью стандарта)

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

    См. Приложение "<Программа со встроенным SQL> ()".
    Приложение F. <Программа на языке PL/1 со встроенным SQL> ()

    (Это дополнение не является неотъемлемой частью стандарта.)

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

    См. Приложение "<Программа со встроенным SQL> ()".
    |

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

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

    b) Если <встроенное объявление реакции на исключительную ситуацию> () содержится в <программе на языке FORTRAN со встроенным SQL> (), то <цель> () в <операторе передачи управления> () должна быть <целым числом без знака> (), которое является меткой выполнимого оператора, появляющегося в той же программной единице, что и <оператор передачи управления> ().

    c) Если <встроенное объявление реакции на исключительную ситуацию> ()содержится в <программе на языке Pascal со встроенным SQL> (), то <цель> () в <операторе передачи управления> () должна быть <целым числом без знака> (), являющимся меткой.

    d) Если <встроенное объявление реакции на исключительную ситуацию> () содержится в <программе на языке PL/1 со встроенным SQL> (), то <цель> () в <операторе передачи управления> () должна специфицировать <идентификатор основного языка> (), являющийся меткой константой или именем переменной типа метка.
  • <Встроенное объявление реакции на исключительную ситуацию> (), содержащееся в <программе со встроенным SQL> () применяется к <оператору SQL> (), содержащемуся в <программе со встроенным SQL> (), тогда и только тогда, когда <оператор SQL> () появляется текстуально после этого <встроеннного объявления реакции на исключительную ситуацию> () в тексте <программы со встроенным SQL> () и нет другого <встроенного объявления реакции на исключительную ситуацию> (), которое специфицирует то же <условие> () и появляется между этим <встроеннным объявлением реакции на исключительную ситуацию> () и этим <оператором SQL> () в тексте <программы со встроенным SQL> ().

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


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

  • <Программа на языке COBOL со встроенным SQL> () - это прикладная программа, состоящая из текста на языке COBOL и текста на языке SQL. Текст на языке COBOL должен удовлетворять стандарту языка COBOL. Текст на языке SQL должен состоять из одного или более <встроенных операторов языка SQL> () и, возможно, одной или более <встроенных секций описаний SQL> (.

  • <Встроенный оператор SQL> () в <программе на языке COBOL со встроенным SQL> () может быть специфицирован везде, где может быть специфицирован оператор языка COBOL в разделе процедур (Procedure Division) <программы на языке COBOL со встроенным SQL> (). Если оператору языка COBOL может непосредственно предшествовать имя параграфа, то и <встроенному оператору языка SQL> () может непосредственно предшествовать имя параграфа.

  • <Идентификатор языка COBOL> () - это любое допустимое в языке COBOL имя переменной. <Идентификатор языка COBOL> () должен содержаться в <программе на языке COBOL со встроенным SQL> ().

  • <Определение переменной языка COBOL> () - это ограниченная форма описания данных в языке COBOL, определяющая переменную.

    а) <Определение переменной языка COBOL> () должно быть законным элементом описания данных в разделе данных (Data Division) программы, полученной из <программы на языке COBOL со встроенным SQL> ().

    b) Необязательная последовательность <символов> () в <определении переменной языка COBOL> () может специфицировать раздел VALUE. Могут ли быть специфицированы другие разделы - определяется реализацией. Последовательность <символов> () должна быть такой, чтобы <определение переменной языка COBOL> () являлось допустимым элементом описания данных языка COBOL.

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

  • <Программа на языке FORTRAN со встроенным SQL> () - это прикладная программа, состоящая из текста на языке FORTRAN и текста на языке SQL. Текст на языке FORTRAN должен удовлетворять стандарту языка FORTRAN. Текст на языке SQL должен состоять из одного или более <встроенных операторов SQL> () и, возможно, одной или более <встроенных секций описаний SQL> ().

  • <Встроенный оператор SQL> () может быть специфицирован везде, где может быть специфицирован оператор языка Фортран. <Встроенный оператор SQL> (), предшествующий какому-либо выполнимому оператору языка FORTRAN в содержащей <программе на языке FORTRAN со встроенным SQL> () не должен быть помечен номером оператора языка FORTRAN. В других случаях, если оператор языка FORTRAN может иметь номер, то и <встроенный оператор SQL> () может иметь номер.

  • Пробелы существенны во <встроенных операторах SQL> (). Правила для <разделителей> () во <встроенных операторах языка SQL> () специфицируются в разделе 5.3, "<Лексемы> ()".

  • <Идентификатор языка FORTRAN> () - это любое допустимое имя переменной в языке FORTRAN. <Идентификатор языка FORTRAN> () должен содержаться в <программе на языке FORTRAN со встроенным SQL> ().

  • <Определение переменной языка FORTRAN> () является ограниченной формой оператора описания типа языка FORTRAN, которая определяет переменную основного языка.

    а) <Определение переменной языка FORTRAN> () должно быть допустимым оператором описанием типа языка FORTRAN в программе, полученной из <программы на языке FORTRAN со встроенным SQL> ().

    b) CHARACTER описывает переменную типа символьной строки. Эквивалентный тип данных языка SQL - это тип CHARACTER такой же длины.

    c) INTEGER описывает переменную типа точного числа. Эквивалентный тип данных языка SQL - это тип INTEGER.

    d) REAL описывает переменную типа приблизительного числа. Эквивалентный тип данных языка SQL - это тип REAL.

    e) DOUBLE PRECISION описывает переменную типа приблизительного числа. Эквивалентный тип данных языка SQL - это тип DOUBLE PRECISION.

  • <Программа на языке FORTRAN со встроенным SQL> () должна содержать переменную с именем SQLCODE, определенную с типом данных INTEGER. В <программе на языке FORTRAN со встроенным SQL> () имя SQLCOD должно использоваться как сокращение SQLCODE.


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

  • <Программа на языке Pascal со встроенным SQL> () - это прикладная программа, состоящая из текста на языке Pascal и текста на языке SQL. Текст на языке Pascal должен удовлетворять стандарту языка Pascal. Текст на языке SQL должен состоять из одного или более <встроенных операторов SQL> () и, возможно, одной или более <встроенных секций описаний SQL> (.

  • <Встроенный оператор SQL> () может быть специфицирован везде, где может быть специфицирован оператор языка Pascal. <Встроенному оператору SQL> () может предшествовать метка языка Pascal.

  • <Идентификатор языка Pascal> () - это любой допустимый идентификатор переменной в языке Pascal. <Идентификатор языка Pascal> () должен содержаться в <программе на языке Pascal со встроенным SQL> ().

  • <Определение переменной языка Pascal> () определяет переменную основного языка.

    а) <Определение переменной языка Pascal> () должно быть допустимым в языке Pascal объявлением переменной в программе, полученной из <программы на языке Pascal со встроенным SQL> ().

    b) PACKED ARRAY [1..] OF CHAR описывает переменную типа символьной строки. Эквивалентный тип данных языка SQL - это тип CHARACTER такой же длины.

    c) INTEGER описывает переменную типа точного числа. Эквивалентный тип данных языка SQL - это тип INTEGER.

    d) REAL описывает переменную типа приблизительного числа. Эквивалентный тип данных языка SQL - это тип REAL.

  • <Программа на языке Pascal со встроенным SQL> () должна содержать переменную с именем SQLCODE, определенную с типом данных INTEGER.


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

  • <Программа на языке PL/1 со встроенным SQL> () - это прикладная программа, состоящая из текста на языке PL/1 и текста на языке SQL. Текст на языке PL/1 должен удовлетворять стандарту языка PL/1. Текст на языке SQL должен состоять из одного или более <встроенных операторов SQL> () и, возможно, одной или более <встроенных секций описаний SQL> (.

  • <Встроенный оператор SQL> () может быть специфицирован везде, где может быть специфицирован оператор языка PL/1 внутри блока процедур. Если оператору PL/1 могла бы предшествовать метка, <встроенному оператору SQL> () может непосредственно предшествовать метка.

  • <Идентификатор языка PL/1> () это любой допустимый идентификатор переменной в языке PL/1. <Идентификатор языка PL/1> () должен содержаться в <программе на языке PL/1 со встроенным SQL> ().

  • <Определение переменной языка PL/1> () определяет одну или более переменных основного языка.

    а) <Определение переменной языка PL/1> () должно быть допустимым в языке PL/1 объявлением данных в программе, полученной из <программы на языке PL/1 со встроенным SQL> ().

    b) <Определение переменной языка PL/1> () должно специфицировать скалярную переменную, а не массив или структуру.

    c) Необязательная последовательность <символов> () в <определении переменной языка PL/1> () может специфицировать раздел INITIAL. Могут ли быть специфицированы другие предложения - определяется реализацией. Последовательность <символов> () должна быть такой, чтобы <определение переменной языка PL/1> () было законным оператором DECLARE языка ПЛ/1.

    Битовые строки, целые числа и XML

    В SQL:2003 исключена поддержка типов битовых строк BIT и BIT VARYING. Основанием является то, что эти типы не поддерживаются в существующих SQL-ориентированных СУБД, и компании-производители не собираются внедрять поддержку битовых строк в обозримом будущем. Так что типы битовых строк просуществовали в стандарте SQL очень недолго (они появились только в стандарте SQL:1999).
    Введен новый точный числовой целый тип – BIGINT. Тип BIGINT аналогичен ранее существовавшим в SQL целым типам INTEGER и SMALLINT, но обладает большей (точнее, не меньшей) точностью. Хотя стандартом не предписывается конкретная точность типа INTEGER (как и для всех числовых типов, она определяется в реализации), в большинстве реализаций поддерживаются 32-х битовые целые значения этого типа. В этих реализациях обычно поддерживаются и 64-х битовые значения типа BIGINT. Однако стандарт оставляет другим реализациям свободу выбора точности этого нового типа. Для типа BIGINT обеспечивается тот же набор арифметических операций, что и для типов INTEGER и SMALLINT: “+”, “-“, ABS, MOD и т.д.
    В части 14 стандарта SQL:2003 специфицируется специальный “тип XML” (XML type), значениями которого, по существу, являются XML-документы. Для этого типа определяется ряд операций, обеспечивающих доступ к элементам значения типа XML, преобразования этих значений и т.д. Заметим, что тип XML вообще не упоминается в базовой второй части стандарта. Да и часть 14 пока не производит впечатление зрелого набора спецификаций.

    Генераторы последовательностей, идентифицирующие и генерируемые столбцы

    В SQL:2003 появилась возможность определения нового вида объектов базы данных – генераторов последовательностей (sequence generators). Такого рода объекты производят изменяемые во времени точные числовые значения. Генераторы последовательностей могут оказаться полезными в разных контекстах среды SQL, но мы решили включить их обсуждение именно в этот подраздел по причине близкой связи со следующими обсуждаемыми в нем вопросами.
    Для создания генератора последовательности в SQL:2003 введен оператор CREATE SEQUENCE. Он определяется следующими синтаксическими правилами:
    CREATE SEQUENCE sequence_generator_name

    [ sequence_generator_option_list> ]
    sequence_generator_option ::=
    AS data_type
    | START WITH signed_numeric_literal
    | INCREMENT BY signed_numeric_literal

    | maxvalue_option
    | minvalue_option
    | cycle_option
    maxvalue_option ::= MAXVALUE signed_numeric_literal
    | NO MAXVALUE
    minvalue_option ::= MINVALUE signed_numeric_literal
    | NO MINVALUE
    cycle_option ::= CYCLE
    | NO CYCLE
    Прежде всего, приведем несколько комментариев к синтаксическим правилам. Каждая разновидность опций оператора может входить в список опций не более одного раза. Если тип данных создаваемого генератора последовательности указывается явно, то он должен быть точным числовым типом со шкалой 0. В противном случае типом данных должен быть точный числовой тип со шкалой 0, выбираемый в реализации. Для остальных опций разумные значения по умолчанию также определяются в реализации (за исключением того, что значением инкремента по умолчанию является 1, а умолчание cycle_option
    предполагает NO CYCLE). Как видно из синтаксических правил, при создании генератора последовательности можно указать минимальное и максимальное значения последовательности, стартовое значение, значение инкремента, а также то, должна ли являться последовательность циклической.
    В каждый момент времени у генератора последовательности имеется текущее базовое значение и цикл, включающие все возможные значения между минимальным и максимальным значениями последовательности такие, что из можно выразить в форме (текущее_базовое_значение + M * инкремент), где M – некоторое натуральное число. Сразу после создания генератора последовательности текущим базовым значением генератора становится заданное стартовое значение.

    В связи с генераторами последовательностей в SQL: 2003 введена новая встроенная функция NEXT VALUE FOR sequence_generator_name, вызов которой приводит к замене текущего базового значения указанного генератора на значение V, принадлежащее текущему циклу генератора и представимому в виде (текущее_базовое_значение + N * инкремент), где N – некоторое натуральное число. Результатом вызова функции является это число V. Например, если определить генератор последовательности следующим образом:

    CREATE SEQUENCE SAMPLESEQ AS INTEGER

    START WITH 1
    INCREMENT BY 1
    MINVALUE 1
    MAXVALUE 10000
    NO CYCLE ;

    то последовательные вызовы NEXT VALUE FOR для SAMPLESEQ могут образовать последовательность значений 1, 2, 3, 4, …

    При создании генератора последовательности можно указать опции CYCLE или NO CYCLE. Если указывается NO CYCLE, то при вызове NEXT VALUE FOR для данного генератора возбуждается исключительная ситуация, если функция пытается возвратить значение, не принадлежащее числовому интервалу между минимальным и максимальным значениями этого последовательностей этого генератора. Если же специфицируется CYCLE, то в такой ситуации функция возвращает минимальное значение последовательностей генератора, если значение инкремента положительно, и минимальное значение, если значение инкремента отрицательно (нулевые значения инкремента запрещены).

    В SQL:2003 также специфицированы операторы ALTER SEQUENCE и DROP SEQUENCE. Оператор ALTER SEQUENCE позволяет изменять минимальное и максимальное значения, значение инкремента, а также изменять установку опции цикличности для указанного генератора последовательности. Кроме того, можно указать новое стартовое значение генератора последовательности (опция RESTART WITH). Тогда следующий за выполнением оператора ALTER SEQUENCE вызов функции NEXT VALUE FOR для данного генератора последовательности выдаст именно это новое стартовое значение.

    Хотя генераторы последовательностей обеспечивают общий механизм генерации уникальных значений, непосредственное использование этой возможности достаточно громоздко – нужно явно создавать требуемый генератор и в нужное время вызывать функцию NEXT VALUE FOR. В SQL:2003 обеспечивается более специализированное общее средство идентифицирующих столбцов (identity columns), которое избавляет пользователей от излишних действий.


    Идентифицирующий столбец в определении таблицы специфицируется в соответствии со следующими синтаксическими правилами:

    identity_column_definition> ::=
    column_name data_type
    GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY
    [ ( common_sequence_generator_option_list ) ]
    [ column_constraint_definition_list ]

    common_sequence_generator_option ::=
    START WITH signed_numeric_literal

    | INCREMENT BY signed_numeric_literal

    | maxvalue_option
    | minvalue_option
    | cycle_option

    Типом данных идентифицирующего столбца должен быть точный числовой тип со шкалой 0 или индивидуальный тип, основанный на таком числовом типе. Определение идентифицирующего столбца вызывает неявное определение для него ограничения NOT NULL NOT DEFERRABLE. В таблице можно определить не более одного идентифицирующего столбца.

    Вот пример определения базовой таблицы с идентифицирующим столбцом:

    CREATE TABLE PARTS (
    PART_NO INTEGER GENERATED ALWAYS AS IDENTITY (
    START WITH 1
    INCREMENT BY 1
    MINVALUE 1
    MAXVALUE 10000
    NO CYCLE ),
    PART_DESCR VARCHAR (100),

    PART_QUANTITY INTEGER );

    При вставке строк в эту таблицу значение номера детали задавать не требуется (и даже нельзя, поскольку в спецификации соответствующего столбца указано GENERATED ALWAYS). Например, если выполнить оператор вставки

    INSERT INTO PARTS (PART_DESCR, PART_QUANTITY) VALUES (‘BOLT’, 30);

    то значение столбца PART_NO будет сгенерировано автоматически с использованием тех же правил, которые используются при генерации значений генераторов последовательностей. Если же при определении идентифицирующего столбца указать опцию GENERATED BY DEFAULT, то автоматическая генерация значений столбца будет производиться только в тех случаях, когда в операторе вставки не задано явное значение.

    Конечно же, как и в случае генераторов последовательностей, можно изменить характеристики идентифицирующего столбца с помощью оператора ALTER TABLE.

    Наконец, один или несколько столбцов определяемой базовой таблицы могут быть специфицированы как генерируемые столбцы (generated columns). Определение такого столбца подчиняется следующим синтаксическим правилам:


    generated_column_definition> ::=
    column_name [ data_type ]
    GENERATED ALWAYS AS ( value_expression )

    [ column_constraint_definition_list ]

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

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

    CREATE TABLE EMP (
    EMP_NO INTEGER,
    EMP_SAL DECIMAL(7,2),
    EMP_BONUS DECIMAL(7,2),
    EMP_TOTAL GENERATED ALWAYS AS (EMP_SAL + EMP_BONUS));

    При выполнении оператора вставки строки

    INSERT INTO EMP (EMP_NO, EMP_SAL, EMP_BONUS)
    VALUES (4431, 50000.00, 5000.00);

    путем вычисления выражения EMP_SAL + EMP_BONUS

    будет автоматически сгенерировано значение столбца EMP_TOTAL, и в таблицу EMP будет занесена строка (4431, 50000.00, 5000.00, 55000.00). Конечно, во вставляемой строке нельзя явно указывать значение генерируемого столбца, но в соответствующей позиции можно указать DEFAULT.

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

    Конструктор типов мультимножества

    В стандарте SQL:1999 допускалась возможность использования только одного вида коллекций – динамических массивов с элементами любого допустимого в SQL типа, кроме типа массива. Тип массива образовывался с помощью конструктора типов массивов ARRAY.
    Стандарт SQL:2003 расширяет возможности использования коллекций в двух важных направлениях. Во-первых, вводится новый конструктор типов мультимножеств MULTISET. Во-вторых, типом элементов любого типа коллекций теперь может быть любой допустимый в SQL тип данных, кроме самого конструируемого типа коллекции. Оба эти расширения качественно влияют на возможную природу организации SQL-ориентированных баз данных и на способы работы с этими базами данных. Мы остановимся на этом несколько более подробно в конце данного подраздела после обсуждения конкретных свойств типов мультимножеств.
    При определении местоположения (например, столбца таблицы) типа мультимножеств используется конструкция dt
    MULTISET, где dt задает тип данных элементов конструируемого типа мультимножеств. Значениями типа мультимножеств являются мультимножества, т.е. неупорядоченные коллекции элементов одного и того же типа, среди которых допускаются дубликаты. Например, значениями типа INTEGER MULTISET являются мультимножества, элементами которых являются целые числа. Примером такого значения может быть мультимножество {12, 34, 12, 45, -64}.
    В отличие от массива, мультимножество является неограниченной коллекцией; при конструировании типа мультимножеств не указывается предельная кардинальность значений этого типа. Однако это не означает, что возможность вставки элементов в мультимножество действительно не ограничена; стандарт всего лишь не требует наличия границы. Ситуация аналогична той, которая возникает при работе с таблицами, для которых в SQL не объявляется максимально допустимое число строк.2
    Значения-мультимножества создаются путем использования специальной конструкции SQL:2003, называемой конструктором значений-мультимножеств (multiset value constructor). Эта конструкция определяется следующими синтаксическими правилами:

    multiset_value_constructor ::=
    multiset_value_constructor_by_enumeration>

    |

    multiset_value_constructor_by_query>

    |

    table_value_constructor_by_query

    multiset_value_constructor_by_enumeration ::=
    MULTISET left_bracket value_expression_commalist right_bracket

    multiset_value_constructor_by_query ::=
    MULTISET ( query_expression)

    table_value_constructor_by_query ::=
    TABLE ( query_expression> )

    Например, следующие выражения являются допустимыми значениями-мультимножествами: MULTISET [14, 16, 17] или MULTISET (SELECT DEPT_NO FROM EMP). Второй случай демонстрирует возможность преобразования таблицы в мультимножество3. Допускается и использование значения-мультимножества в качестве ссылки на таблицу в разделе FROM запроса. Для этого к значению-мультимножеству применяется операция UNNEST. Вот простой пример допустимого запроса:

    SELECT T.A, T.A + 2 AS PLUS_TWO

    FROM UNNEST(MULITISET [14,16,17]) AS T(A)

    В результате выполнения запроса будет получена таблица

  • A

    PLUS_TWO

    14

    16

    16

    18

    17

    19

    Для типов мультимножеств поддерживаются операции для преобразования типа значения-мультимножества к типу массивов или другому типу мультимножеств с совместимым типом элементов (операция CAST), для удаления дубликатов из мультимножества (функция SET), для определения числа элементов в заданном мультимножестве (функция CARDINALITY), для выборки элемента мультимножества, содержащего в точности один элемент (функция ELEMENT). Кроме того, для мультимножеств обеспечиваются операции объединения (MULTISET UNION), пересечения (MULTISET INTERSECT) и определения разности (MULTISET EXCEPT). Каждая из операций может выполняться в режиме с сохранением дубликатов (режим ALL) или с устранением дубликатов (режим DISTINCT).

    Наконец, введены три новые агрегатные функции. Агрегатная функция COLLECT создает мультимножество из значений аргумента в каждой строке группы строк. Функция FUSION производит объединение значений-мультимножеств из всех строк группы строк. Функция INTERSECT производит пересечение значений-мультимножеств из всех строк группы строк. Покажем на простом примере, как работают эти агрегатные функции. Пусть имеется таблица PROGRAMMERS следующего вида:


    PROGRAMMER

    FAVOURITE_LANGUAGES

    ‘Smith’

    MULTISET [‘Java’, ‘Pascal’, ‘Perl’]

    ‘Brown’

    MULTISET [‘Python’, ‘C++’, ‘Java’]

    ‘Scott’

    MULTISET [‘Python’, ‘Java’]

    Тогда в результате запроса

    SELECT COLLECT(PROGRAMMER) AS ALL_PROGRAMMERS,
    FUSION(FAVOURITE_LANGUAGES) AS ALL_LANGUAGES
    INTERSECT(FAVOURITE_LANGUAGES) AS COMMON_LANGUAGES

    FROM PROGRAMMERS

    будет получена следующая таблица с одной строкой, все три столбца которой содержат значения-мультимножества:

    ALL_PROGRAMMERS

    ALL_LANGUAGES

    COMMON_LANGUAGES

    MULTISET

    [‘Smith’,

    ‘Brown’

    ‘Scott’

    MULTISET

    [‘Java’,

    ‘Pascal’,

    ‘Perl’

    ‘Python’,

    ‘C++’,

    ‘Java’

    ‘Python’,

    ‘Java’]

    MULTISET

    [‘Java’]

    При использовании мультимножеств в условных выражениях можно применять следующие предикаты:



  • сравнения по равенству (“=”);


  • сравнения по неравенству (“<>”);


  • проверки того, что заданное значение является элементом мультимножества (MEMBER);


  • проверки того, что одно мультимножество входит в другое мультимножество (SUBMULTISET);



  • проверки того, что мультимножество содержит дубликаты (IS A SET).

    После короткого рассмотрения особенностей типов мультимножеств в SQL:2003 обсудим, почему мы считаем отмеченные в начале подраздела расширенные возможности работы с типами коллекций принципиально важными. Дело в том, что даже при наличии определяемых пользователями типов данных и типов массивов SQL:1999 (см. [3]) не предоставлял полных возможностей для преодоления исторически присущего реляционной модели данных вообще и SQL, в частности, ограничения “плоских таблиц”. Теперь, после появления конструктора типов мультимножеств и устранения ограничений на тип данных элементов коллекции, это историческое ограничение полностью ликвидировано.


    Конечно же, мультимножество, типом элементов которого является анонимный строчный тип4

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

    Другой вопрос, принесут ли эти новые возможности существенную практическую пользу разработчикам и пользователям SQL-ориентированных баз данных? Как это обычно бывает в случае SQL, на этот вопрос трудно ответить однозначно. Скорее всего, большинство разработчиков, традиционно работающих в SQL-среде, просто не будет использовать новые средства, как не использует и объектно-реляционные расширения SQL. Но возможно, что расширенная поддержка типов коллекций привлечет к SQL-ориентированным СУБД новую категорию разработчиков и пользователей из числа, например, тех, которые традиционно использовали объектно-ориентированную или какую-либо другую среду, отличную от SQL.

    Между прочим, как кажется автору этой статьи, на введение типов мультимножеств в SQL:2003 оказали влияние работы Дейта и Дарвена . Конечно, SQL:2003 остается языком SQL со всеми присущими ему недостатками. Конечно, предложения Третьего манифеста, выглядят изящнее и стройнее, чем то, что появилось в SQL. Но похоже, что с использованием SQL:2003 теперь можно добиться почти тех же результатов, которые обеспечило бы применение какого-либо языка D.

    В конце 2003 г. был

    Сергей Кузнецов

    В конце 2003 г. был принят и опубликован новый вариант международного стандарта SQL:2003 [1]. Многие специалисты считали, что в варианте стандарта, следующем за SQL:1999, будут всего лишь исправлены неточности SQL:1999. Но на самом деле, в SQL:2003 специфицирован ряд новых и важных свойств.

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



  • 9075-1, SQL/Framework;


  • 9075-2, SQL/Foundation;


  • 9075-3, SQL/CLI;


  • 9075-4, SQL/PSM;


  • 9075-9, SQL/MED;


  • 9075-10, SQL/OLB;


  • 9075-11, SQL/Schemata;


  • 9075-13, SQL/JRT;


  • 9075-14, SQL/XML.

    Части 1-4 и 9-10 с необходимыми изменениями остались такими же, как и в SQL:1999. Часть 5 (SQL/Bindings) больше не существует; соответствующие спецификации включены в часть 2. Раздел части 2 SQL:1999, посвященный информационной схеме, выделен в отдельную часть 11. Появились две новые части – 13 и 14. Часть 13 полностью называется “SQL Routines and Types Using the Java Programming Language” (“Использование подпрограмм и типов SQL в языке программирования Java”). Появление такой отдельной части стандарта оправдано повышенным вниманием к языку Java со стороны ведущих производителей SQL-ориентированных СУБД. Наконец, последняя часть SQL:2003 посвящена спецификациями языковых средств, позволяющих работать с XML-документами в среде SQL. В этой статье мы ограничимся кратким обсуждением изменений и дополнений, произведенных комитетом по стандартизации SQL в части 2.

    Как указывается в [2], наиболее серьезные изменения языка SQL, специфицированные в части 2 стандарта SQL:2003, касаются следующих аспектов:



  • типы данных;


  • подпрограммы, вызываемые из SQL;


  • расширенные возможности оператора CREATE TABLE;



  • новый объект схемы – генератор последовательностей;


  • новые виды столбцов – идентифицирующие столбцы (identity column) и генерируемые столбцы (generated column);


  • новый оператор MERGE;

    В следующих разделах статьи1

    мы кратко обсудим эти аспекты.

    Новые типы данных

    В SQL:2003 произошли некоторые изменения в системе типов SQL. Некоторые типы удалены, а другие добавлены. Среди новых типов наиболее важным, с точки зрения автора этой статьи, является конструктор типов мультимножеств; по этой причине его обсуждение выделяется в отдельный подраздел.

    Новый оператор обновления базы данных MERGE

    В приложениях SQL-ориентированных баз данных часто возникает потребность в передаче множества строк из таблицы, обновлявшейся при выполнении транзакции (транзакционной таблицы), в некоторую основную таблицу базы данных. Обычно транзакционная таблица содержит обновленные варианты строк, существующих в основной таблице, а также, возможно, новые строки, которые должны быть занесены в основную таблицу. При наличии традиционных средств обновления базы данных содержимое транзакционной таблицы может быть перенесено в основную таблицу путем выполнения двух отдельных шагов. На первом шаге требуется выполнить оператор UPDATE для всех строк основной таблицы, для которых имеются модифицированные “двойники” в транзакционной таблице. Затем нужно выполнить оператор INSERT для занесения в основную таблицу всех строк транзакционной таблицы, для которых таких двойников нет. Оператор MERGE, введенный в SQL:2003, позволяет выполнить такую операцию за один шаг, более эффективный и проще специфицируемый. Вот общий синтаксис этого нового оператора в немного упрощенной форме:
    MERGE INTO table_name [ [ AS ] correlation_name ]
    USING table_reference
    ON conditional_expression merge_operation_specification
    merge_operation_specification ::=
    { merge_when_matched_clause | merge when not matched clause }
    | merge_when_matched_clause merge_when_not_matched_clause
    | merge_when_not_matched_clause merge_when_matched_clause

    merge_when_matched_clause ::=
    WHEN MATCHED THEN UPDATE SET update_assignment_commalist
    merge_when_not_matched_clause ::=
    WHEN NOT MATCHED THEN INSERT [ ( column_commalist ) ]
    VALUES ( value_expression_commalist )
    Как видно из синтаксиса, в операторе обязательно содержится условное выражение и, по крайней мере, один из разделов “слияния при наличии сопоставления” (merge_when_matched_clause) и “слияния при отсутствии сопоставления” (merge when not matched clause). Пусть T1 обозначает таблицу, указанную в разделе USING, а T2 – имя таблицы, указанной в разделе INTO. Тогда семантика выполнения операции определяется следующим образом:

    Во-вторых, очевидным образом не просматриваются разумные способы использования оператора MERGE, отличные от тривиальных случаев.

    Приведем пример тривиального (хотя и вполне полезного и осмысленного) использования оператора. Предположим, что в базе данных предприятия поддерживается сводная таблица INVENTORY (инвентарная ведомость), содержащая данные обо всех деталях, которые имеются на предприятии. Дополнительные детали поступают на предприятие путем поставок от поставщиков, причем каждой поставке соответствует транзакционная таблица SHIPMENT. В завершение транзакции поставки требуется “перелить” данные из таблицы SHIPMENT в таблицу INVENTORY. Пусть таблицы SHIPMENT и INVENTORY имеют одну и ту же структуру, а наполнение их такое, какое показано на рис. 3.

    INVENTORY

    PART_NO

    PART_NAME

    PART_QUANTITY

    1

    Bolt

    5

    2

    Screw

    10

    3

    Nut

    30

    SHIPMENT

    PART_NO

    PART_NAME

    PART_QUANTITY

    1

    Bolt

    5

    4

    Nail

    10

    3

    Nut

    30

    MERGE INTO INVENTORY ...

    PART_NO

    PART_NAME

    PART_QUANTITY

    1

    Bolt

    10

    2

    Screw

    10

    3

    Nut

    60

    4

    Nail

    10

    Рис. 3. Пример использования оператора MERGE

    В обеих таблицах столбец PART_NO

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

    примет вид, показанный в нижней части рис. 3.

    MERGE INTO INVENTORY AS INV
    USING (SELECT PART_NO, PART_NAME, PART_QUANTITY FROM SHIPMENT) AS SH
    ON (INV.PART_NO = SH.PART_NO)
    WHEN MARCHED THEN UPDATE
    SET PART_QUANTITY = INV.PART_QUANTUTY + SH.PART_QUANTITY

    WHEN NOT MARCHED THEN INSERT
    (PART_NO, PART_NAME, PART_QUANTITY)
    VALUES (SH.PART_NO, SH.PART_NAME, SH.PART_QUANTITY) ;

    Расширенные возможности оператора CREATE TABLE

    В SQL:2003 возможности оператора SQL CREATE TABLE, предназначенного для определения базовых таблиц, существенно расширены, и в этом разделе мы кратко обсудим эти расширения.

    Раздел AS оператора CREATE TABLE

    Использование раздела LIKE в операторе CREATE TABLE полезно, если в определение новой таблицы требуется включить полную копию структуры одной или нескольких существующих таблиц. Однако в некоторых случаях оказывается полезным скопировать только часть структуры существующих таблиц, а в общем случае – создать таблицу по образу некоторого выражения запросов.
    Для этих целей предназначена расширенная форма оператора CREATE TABLE, включающая раздел AS. В этом случае используется следующая синтаксическая форма оператора CREATE TABLE:
    CREATE TABLE table_name [ column_name_commalist ]
    AS subquery { WITH NO DATA | WITH DATA }
    При выполнении подобного оператора создается таблица со структурой (именами столбцов, их типами данных и т.д.) выражения запросов. Допускаются также возможности переименования столбцов и занесения в создаваемую таблицу строк, генерируемых при выполнении выражения запроса.
    Выполнение оператора CREATE TABLE с разделом AS не приводит к порождению зависимости новой таблицы от определяющего ее выражения запросов. После начального заполнения новой таблицы обновления таблиц, над которыми задано выражение запросов, не будут автоматически отражаться в состоянии новой таблицы.

    Раздел LIKE оператора CREATE TABLE

    Одной из возможностей SQL:1999 являлась возможность определения новой базовой таблицы, подобной (like) одной или нескольким существующим таблицам. В форме, специфицированной в стандарте SQL:1999, она не представляла существенного интереса. Однако, чтобы пояснить суть расширения, введенного в SQL:2003, мы должны сначала обсудить исходный вариант.
    Итак, в SQL:1999 в списке элементов определения таблицы оператора CREATE TABLE, помимо определений столбцов и табличных ограничений, могли присутствовать элементы вида LIKE table_name. Наличие одного или нескольких подобных разделов в определении новой таблицы приводило к копированию в ее определении структуры указанных существующих таблиц. Однако при этом копировались только имена столбцов указанных таблиц и типы данных этих столбцов. Другими словами, выполнялась примитивная макроподстановка. Пример определения таблицы с использованием раздела LIKE показан на рис. 2.

    CREATE TABLE T1 (
    C1 VARCHAR (100) NOT NULL DEFAULT ‘TEST’,
    C2 INTEGER );
    CREATE TABLE T2 (
    LIKE T1,
    C3 CHAR (20));
    CREATE TABLE T3 (
    C1 VARCHAR (100),
    C2 INTEGER,
    C3 CHAR (20));
    Рис. 2. Пример определения таблицы с использованием раздела LIKE в стиле SQL:1999
    Как показывает рис. 2, определение таблицы T2, полученное с использованием раздела LIKE, эквивалентно определению таблицы T3. В определении таблицы T2 утрачена некоторая информация, присутствующая в определении T1: в столбце C1 не допускается наличие неопределенных значений, и для него указано значение по умолчанию.
    Хотя и вариант раздела LIKE, специфицированный в SQL:1999, может быть полезен на практике при определении похожих таблиц с большим числом столбцов, в SQL:2003 введены некоторые необязательные расширения, позволяющие управляемым образом копировать больше информации о столбцах существующих таблиц. Более точно, в SQL:2003 раздел LIKE имеет следующую синтаксическую форму:
    like_clause ::= LIKE table_name [ like_option_list ]
    like_option ::= INCLUDING IDENTITY | EXCLUDING IDENTITY
    | INCLUDING DEFAULTS | EXCLUDING DEFAULTS
    | INCLUDING GENERATED | EXCLUDING GENERATED
    Свойства IDENTITY и GENERATED – это новые свойства столбцов, введенные в SQL:2003. Мы обсудим их ниже в этом разделе. Пока же ограничимся примером определения таблицы с использованием раздела LIKE в стиле SQL:2003, в котором копируется информация о значении столбца по умолчанию:
    CREATE TABLE T4 (
    LIKE T1,
    INCLUDING DEFAULTS);
    Таблица T4 теперь имеет в точности ту же структуру, что и таблица T1. При отсутствии опций раздел LIKE ведет себя так же, как и в SQL:1999, за тем исключением, что свойство NOT NULL столбца всегда копируется. Заметим также, что выполнение оператора CREATE TABLE с разделом LIKE не приводит к образованию какой-либо зависимости между новой таблицей и той, которая использовалась в разделе LIKE (т.е. их структура может независимо изменяться).

    Табличные функции

    В SQL:2003 поддерживается механизм табличных функций, т.е. функций, вызываемых из SQL и возвращающих значение-“таблицу”. В связи с отсутствием поддержки в SQL “типа таблиц” типом результата табличной функции в действительности является тип мультимножеств (типом элементов которого является соответствующий анонимный строчный тип). Однако к результату табличной функции можно адресовать запросы таким же образом, как и к таблице.
    Разработчики стандарта SQL:2003 полагают, что табличные функции полезны сами по себе, вне связи с поддержкой общего механизма мультимножеств. По этой причине стандарт не требует поддержки мультимножеств в качестве обязательного условия поддержки табличных функций.
    Происхождение термина “табличная функция” очевидно. В синтаксических конструкциях определения и вызова табличных функций их близость с таблицами подчеркивается требованием наличия ключевого слова TABLE в различных местах выражений. Например, в разделе RETURN определения табличной функции указывается ключевое слово TABLE, вслед за которым перечисляются пары имя_столбца/тип_данных. На рис. 1 приведены определения двух табличных функций, первая из которых является внешней, а вторая содержит тело, определяемое на языке SQL.


    CREATE FUNCTION timetable ()
    RETURNS TABLE (
    CINEMA_NAME VARCHAR (20),
    MOVIE_NAME VARCHAR (4),
    TIME_TABLE TIME )
    NOT DETERMINISTIC
    NO SQL
    LANGUAGE C
    EXTERNAL
    PARAMETER STYLE SQL
    (a) Определение внешней табличной функции
    CREATE FUNCTION DEPTEMP (DEPTNO INTEGER)
    RETURNS TABLE (
    EMPNO INTEGER,
    EMPNAME VARCHAR (20))
    LANGUAGE SQL
    READS SQL DATA
    DETERMINISTIC
    RETURN TABLE (
    SELECT EMP_NO, EMP_NAME
    FROM EMP
    WHERE EMP.DEPT_NO = DEPTEMP.DEPTNO )
    (b) Определение табличной функции с телом, задаваемым на языке SQL
    Рис. 1. Определения табличных функций
    Внешние табличные функции позволяют запрашивать данные, которые не хранятся в базовых таблицах и являются внешними по отношению к базе данных. Например, табличная функция, определение которой приведено на рис. 1a, возвращает множество строк, представляющих кинотеатры, названия демонстрируемых в них фильмов и расписание сеансов.

    В определении внешней функции может содержаться ряд опций, которые влияют на ожидаемое поведение функции. В нашем случае функция реализуется на языке C (для краткости, на рис. A.1a не приведен код тела функции). Об этом факте свидетельствует наличие раздела LANGUAGE C, который определяет конкретный способ передачи параметров. Наличие раздела NO SQL говорит о том, при выполнении функции не будут производиться обращения к SQL-процессору для обработки операторов SQL. Этот факт нужно учитывать при управлении транзакциями. Наличие раздела NOT DETERMINISTIC означает, что функция может возвращать разные результаты при разных вызовах с одним и тем же набором аргументов. Знание этого факта влияет на работу оптимизатора SQL-запросов. Наконец, наличие раздела PARAMETER STYLE SQL говорит о том, что аргументы и результаты функции могут являться неопределенными значениями.

    С другой стороны, табличные функции с телом, специфицируемым на языке SQL, представляют собой параметризованные представления (parameterized views (обычные представления в SQL фиксируются в момент создания). Например, у табличной функции, определение которой приведено на рис. 1b, имеется один параметр – DEPTNO. Этот параметр используется в разделе WHERE

    запроса в теле функции и определяет результирующее множество строк. Разные значения аргумента вызова функции приведут к разным возвращаемым ее множествам строк (строк служащих, работающих в указываемом отделе).

    И в этом случае в определении функции могут содержаться необязательные разделы, влияющие на поведение функции. Наличие раздела LANGUAGE SQL говорит о том, что тело функции написано на языке SQL (в нашем случае тело состоит из единственного оператора RETURN). Раздел READS SQL DATA означает, что доступ к данным, хранимым в базе данных, будет производиться в режиме только чтения. Наличие раздела DETERMINISTIC свидетельствует о том, что функция возвращает один и тот же результат при наличии одних и тех же аргументов и одного и того же состояния базы данных.

    Наиболее естественным местом вызова табличной функции является раздел FROM оператора выборки (хотя табличные функции могут вызываться и во многих других контекстах). В этом случае вызов функции предваряется ключевым словом TABLE и может встречаться везде, где может присутствовать ссылка на таблицу. Ниже приведен простой пример запроса, в котором используется вызов табличной функции (“Получить названия кинотеатров, в которых демонстрируется фильм "Властелин колец. Две крепости", и расписание сеансов):

    SELECT CINEMA_NAME, TIME_TABLE
    FROM TABLE(timetable ()) AS TT

    WHERE TT.MOVIE_NAME = ‘The Lord of Rings: Two Towers’;


        Базы данных: Разработка - Управление - Excel