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

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

Функция

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

Формат

     <close statement>::=
         CLOSE <cursor name>

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

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

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

  1. Курсор должен быть в открытом состоянии.
  2. Курсор переводится в закрытое состояние и разрушается копия <спецификации курсора> (<cursor soecificaton>).

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

Функция

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

Формат

     <commit statement>::=
              COMMIT WORK

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

Нет.

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

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

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

Функция

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

Формат

     <declare cursor> ::=
               DECLARE <cursor name> CURSOR
               FOR <cursor specification>
     <cursor specification> ::=
               <query expression> [<order by clause>...]
     <query expression> ::=
                <query term>
              | <query expression> UNION [ALL] <query term>
     <query term> ::=
               <query specification> | (<query expression>)
     <order by clause> ::=
               ORDER BY <sort specification>
                        [{,<sort specification>}...]
     <sort specification> ::=
              { <unsigned integer> | <column specification> }
               [ASC | DESC]

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

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

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

  5. a) Если не указано UNION, то описанием Т является описание <спецификации запроса> (<query specification>).
    b) Если указано UNION, то пусть для каждого специфицированного UNION Т1 и Т2 обозначают таблицы, которые специфицированы в <выражении запроса> (<query expression>) и <терме запроса> (<query term>). <Список выборки> (<select list>) в спецификациях Т1 и Т2 должен состоять из "*" или <спецификаций столбцов> (<column specification>). Кроме имен столбцов, описания Т1 и Т2 должны быть идентичными. Все столбцы результата неименованы. За исключением <имен столбцов> (<column name>), описание результата такое же, как описание Т1 и Т2.
  6. Если указано ORDER BY, то каждая <спецификация сортировки> (<sort specification>) в <разделе order by> (<order by clause>) должна идентифицировать столбец таблицы Т.
    a) Если <спецификация сортировки> (<sort specification>) содержит <спецификацию столбцов> (<column specification>), то <спецификация сортировки> (<sort specification>) идентифицирует столбец Т с именем, указанным в этой <спецификации столбца> (<column specification>).
    b) Если <спецификация сортировки> (<sort specification>) содержит <целое без знака> (<unsigned integer>), то это целое должно быть больше нуля и не более степени таблицы T. <Спецификация сортировки> (<sort specification>) указывает столбец Т с порядковой (ordinal) позицией, специфицируемой этим <целым без знака> (<unsigned integer>).

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


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

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

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

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

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

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

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

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

Функция

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

Формат

     <delete statement: positioned> ::=
                DELETE FROM <table name>
                WHERE CURRENT OF <cursor name>

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

  1. Применимые <привилегии> (<privileges>) для <имени таблицы> (<table name>) должны включать DELETE.
    Замечание: "Применимые <привилегии> (<privileges>)" для <имени таблицы> (<table name>) определяются в 6.10, "<Определение привилегий> (<privileges definition>).
  2. Содержащий <модуль> (<module>) должен содержать <объявление курсора> (<declare cursor>) CR с тем же <именем курсора> (<cursor name>), что и <имя курсора> (<cursor name>) в <операторе удаления: позиционном> (<delete statement: positioned>).
  3. Таблица, на которую указывает CR, не должна быть только читаемой.
  4. Пусть Т обозначает таблицу, идентифицируемую <именем таблицы> (<table name>). Т должна быть таблицей, идентифицируемой в первом <разделе from> (<from clause>) в <спецификации курсора> (<cursor specification>) CR.

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

  1. Курсор CR должен быть установлен на строку.
  2. Строка, из которой получена текущая строка CR, удаляется.

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

Функция

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

Формат

     <delete statement: searched> ::=
           DELETE FROM <table name>
           WHERE [<search condition>]

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

  1. Применимые <привилегии> (<privileges>) для <имени таблицы> (<table name>) должны включать DELETE.
    Замечание: Применимые <привилегии> (<privileges>) для <имени таблицы> (<table name>) определяются в 6.10, "<определение привилегий> (<privileges definition>)".
  2. Пусть Т обозначает таблицу, идентифицируемую <именем таблицы> (<table name>). Т не должна быть только читаемой таблицей или таблицей, которая идентифицируется в <разделе from> (<from clause>) любого <подзапроса> (<subquery>), содержащегося в <условии поиска> (<search condition>).
  3. Область действия <имени таблицы> (<table name>) - целиком <оператор удаления: поисковый> (<delete statement: searched>.

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


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

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

Функция

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

Формат

     <fetch statement> ::=
          FETCH <cursor name> INTO <fetch target list>
     <fetch target list> ::=
          <target specification>[{,<target specification>}...]

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

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

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

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

  1. Курсор CR должен быть в открытом состоянии.
  2. Если таблица, указываемая курсором CR, является пустой, или CR позиционирован на последнюю строку или за ней, то CR устанавливается в позицию после последней строки, параметру SQLCODE присваивается значение 100 и значения не присваиваются целям, идентифицированным в <списке целей чтения> (<fetch target list>).
  3. Если CR установлен в позицию перед строкой, то CR устанавливается на эту строку и значения этой строки присваиваются соответствующим целям.
  4. Если CR установлен на r, где r - это строка, отличная от последней строки, то курсор устанавливается на строку, непосредственно следующую за строкой r, и значения из строки за r присваиваются соответствующим целям.
  5. Присваивание значений целям в <списке целей чтения> (<fetch target list>), кроме параметра SQLCODE, осуществляются в порядке, определяемом реализацией. Параметр SQLCODE получает значение последним.
  6. Если в процессе присваивания значения цели возникает ошибка, то в параметр SQLCODE устанавливается отрицательное значение, определяемое реализацией, и значения целей, отличных от параметра SQLCODE, зависят от реализации.
  7. Пусть V обозначает цель, а v - соответствующее значение в текущей строке CR.
  8. Если v - это неопределенное значение, то для V должен быть специфицирован индикатор, и этот индикатор устанавливается в -1. Если v - не неопределенное значение, и V обладает индикатором, то:
    a) Если тип данных V есть тип символьных строк длины L и длина M v больше L, то индикатор получает значение M.
    b) Иначе значение индикатора устанавливается в 0.
  9. Цель, идентифицированная i-той <спецификацией цели> (<target specification>) из <списка целей чтения> (<fetch target list>), соответствует i-ому значению из текущей строки CR.

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

Назад | Содержание | Вперед


Copyright © CIT