Замечания по выпуску


38.2 Глава 3. Language Elements (Элементы языка)

38.2.1 Правила именования и неявные спецификаторы имен объектов

В этот раздел главы 3 добавьте следующее примечание:

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

38.2.2 DATALINK Assignments

Абзац в этом разделе изменен на следующий:

Учтите, что размер параметра URL или результата функции совпадает
с размером входных или выходных параметров и ограничен длиной столбца DATALINK.
Однако в некоторых случаях с возвращаемым значением URL передается элемент доступа.
В случаях, когда это возможно, выходная переменная должна иметь 
достаточный размер, чтобы вместить элемент доступа и длину столбца 
DATALINK.
Поэтому задаваемая на входе действительная длина комментария и URL в 
полной форме не должна превосходить размер выходного параметра.
Если она превосходит эту длину, возникает ошибка.

38.2.3 Expressions (Выражения)

38.2.3.1 Синтаксическая диаграмма

Синтаксическая диаграмма была изменена на:

   .-операция-----------------------------------------.
   V                                                  |
>>----+-----+---+-функция--------------------------+--+--------><
      +- + -+   +-(выражение)----------------------+
      '- - -'   +-константа------------------------+
                +-имя-столбца----------------------+
                +-переменная-хоста-----------------+
                +-специальный-регистр--------------+
                +-(скалярная-полная-выборка)-------+
                +-временной-интервал---------------+
                +-выражение-case-------------------+
                +-спецификация-преобразования-типа-+
                +-операция-ссылки------------------+
                +-функция-OLAP---------------------+
                +-вызов-метода---------------------+
                +-интерпретация-подтипа------------+
                '-ссылка-на-последовательность-----'
 
операция
 
             (1)
|---+-CONCAT------+---------------------------------------------|
    +- / ---------+
    +- * ---------+
    +- + ---------+
    '- - ---------'
 

Примечания:

  1. В качестве синонима CONCAT можно использовать ||.

38.2.3.2 Функции OLAP

Следующее исправление надо внести в подраздел "OLAP Functions" раздела "Expressions" Главы 3.

 
aggregation-function
 
|--функция-столбца--OVER---(--+---------------------------+----->
                              '-| условие-раздела-окна |--'
 
>----+----------------------------------------------------------------------+>
     '-| условие-порядка-окна |--+---------------------------------------+--'
                                 '-| условие-группы-суммирования-окна |--'
 
>---------------------------------------------------------------|
 
условие-порядка-окна
 
              .-,-------------------------------------------------.
              V                              .-| опция ASC |---.  |
|---ORDER BY-----выражение-ключа-сортировки--+-----------------+--+->
                                             '-| опция DESC |--'
 
>---------------------------------------------------------------|
 
опция ASC
 
         .-NULLS LAST--.
|---ASC--+-------------+----------------------------------------|
         '-NULLS FIRST-'
 
опция DESC
 
          .-NULLS FIRST--.
|---DESC--+--------------+--------------------------------------|
          '-NULLS LAST---'
 
условие-группы-суммирования-окна
 
|---+-ROWS--+---+-| начало-группы |-+---------------------------|
    '-RANGE-'   +-| группа-между |--+
                '-| конец-группы |--'
 
конец-группы
 
|---+-UNBOUNDED FOLLOWING-------------+-------------------------|
    '-константа-без-знака--FOLLOWING--'
 

В описании условия-порядка-окна:

NULLS FIRST
При упорядочении окна пустые значения считаются идущими в порядке сортировки перед всеми непустыми значениями.

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

В описании условия-группы-суммирования-окна:

условие-группы-суммирования-окна
Группа суммирования строки R - это набор строк, определяемых относительно R в упорядочении строк раздела R. Это условие задает группу суммирования. Если это условие не задано, по умолчанию используется условие RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW, генерирующее результат суммирования с накоплением.

ROWS
Указывает, что группа суммирования определяется через число строк.

RANGE
Указывает, что группа суммирования определяется через расстояние от ключа сортировки.

начало-группы
Задает начальную точку для группы суммирования. Конец группы суммирования - текущая строка. Условие начало-группы эквивалентно условию группа-между типа "BETWEEN начало-группы AND CURRENT ROW".

группа-между
Задает начало и конец группы суммирования в виде ROWS или RANGE.

конец-группы
Задает конечную точку для группы суммирования. Начало группы суммирования - текущая строка. Условие конец-группы эквивалентно условию группа-между типа "BETWEEN CURRENT ROW AND конец-группы".

UNBOUNDED PRECEDING
Включить весь раздел до текущей строки. Это условие можно задать с ROWS или с RANGE. Его можно также задать с несколькими выражениями-ключей-сортировки в условии-порядка-окна.

UNBOUNDED FOLLOWING
Включить весь раздел после текущей строки. Это условие можно задать с ROWS или с RANGE. Его можно также задать с несколькими выражениями-ключей-сортировки в условии-порядка-окна.

CURRENT ROW
Задает начало или конец группы суммирования на основе текущей строки. Если задано условие ROWS, границей группы суммирования будет текущая строка. Если задано условие RANGE, граница группы суммирования будет включать набор строк с теми же значениями выражений-ключей-сортировки, что и текущая строка. Это условие нельзя задавать в границе-группы-2, если в границе-группы-1 задано значение FOLLOWING.

значение PRECEDING
Задает диапазон или число строк, идущих перед текущей строкой. Если задано условие ROWS, значение - это положительное целое число, обозначающее число строк. Если задано условие RANGE, тип данных значения должен быть совместим с типом данных выражения-ключа-сортировки условия-порядка-окна. Может быть только одно выражение-ключа-сортировки и тип данных этого выражения-ключа-сортировки должен допускать вычитание. Это условие нельзя задавать в границе-группы-2, если в границе-группы-1 задано CURRENT ROW или значение FOLLOWING.

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

38.2.3.3 Справочник по последовательностям

В конец раздела Expressions (Выражения) после "Subtype Treatment" (Использование подтипа) надо добавить следующую информацию.

 
ссылка-на-последовательность
 
|--+-| выражение-nextval |-+------------------------------------|
   '-| выражение-prevval |-'
 
выражение-nextval
 
|---NEXTVAL FOR--имя-последовательности-------------------------|
 
выражение-prevval
 
|---PREVVAL FOR--имя-последовательности-------------------------|
 

NEXTVAL FOR имя-последовательности
Выражение NEXTVAL возвращает следующее значение для последовательности, задаваемой именем-последовательности.

PREVVAL FOR имя-последовательности

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

Выражение PREVVAL можно использовать, только если выражение NEXTVAL с тем же именем последовательности уже было использовано в текущем сеансе пользователя (в текущей или одной из предыдущих транзакций) (SQLSTATE 51035).

Прим.:
  • Когда имя последовательности задано в выражении NEXTVAL, для нее генерируется новое значение. Однако если в запросе есть несколько экземпляров выражения NEXTVAL с тем же именем последовательности, счетчик последовательности увеличивается только один раз для каждой строки результата.
  • К самому последнему сгенерированному значению последовательности можно повторно обращаться с помощью выражения PREVVAL с именем этой последовательности. В одном операторе может быть несколько экземпляров выражений PREVVAL с тем же именем последовательности.
  • Одно и то же значение последовательности может использоваться в качестве уникального ключа в двух различных таблицах - получите значение последовательности для первой строки с помощью выражения NEXTVAL (при этом будет сгенерировано новое значение последовательности) и используйте выражение PREVVAL для другой строки (этот экземпляр PREVVAL возвращает значение последовательности, сгенерированное предыдущим выражением NEXTVAL), как показано ниже:
       INSERT INTO order(orderno, custno)
       VALUES (NEXTVAL FOR order_seq, 123456);
     
       INSERT INTO line_item  (orderno, partno, quantity)
          VALUES (PREVVAL FOR order_seq, 987654, 1);
    
  • Примеры мест, где могут быть заданы выражения NEXTVAL и PREVVAL:
    • оператор-выборки или оператор SELECT INTO: внутри условия-выборки, если оператор не содержит ключевого слова DISTINCT, условия GROUP BY, условия ORDER BY, ключевого слова UNION, ключевого слова INTERSECT или ключевого слова EXCEPT
    • оператор INSERT: в условии VALUES
    • оператор INSERT: внутри условия-выборки в полной выборке
    • оператор UPDATE: внутри условия-выборки в полной выборке в выражении в условии SET (оператор UPDATE с поиском или с указанием позиции)
    • оператор VALUES INTO: внутри условия-выборки в полной выборке в выражении
  • Примеры мест, где нельзя задавать выражения NEXTVAL и PREVVAL (SQLSTATE 428F9):
    • условие JOIN полного внешнего объединения
    • значение DEFAULT для столбца в операторе CREATE TABLE или ALTER TABLE
    • определение генерируемого столбца в операторе CREATE TABLE или ALTER TABLE
    • условие проверочного ограничения
    • оператор CREATE TRIGGER
    • оператор CREATE VIEW
    • оператор CREATE METHOD
    • оператор CREATE FUNCTION.
  • Кроме того, выражение NEXTVAL нельзя задавать (SQLSTATE 428F9) в:
    • выражении CASE
    • списке параметров функции сводки
    • подзапросе
    • операторе SELECT, который содержит операцию DISTINCT
    • условии JOIN объединения
    • условии GROUP BY оператора SELECT
    • операторе SELECT, который объединен с другим оператором SELECT с помощью оператора множества UNION, INTERSECT или EXCEPT
    • вложенном табличном выражении
    • списке параметров табличной функции
    • условии WHERE оператора SELECT, DELETE или UPDATE
    • условии ORDER BY
    • списке параметров оператора CALL.
  • Когда для последовательности генерируется значение, это значение используется; затем, когда значение требуется в следующий раз, генерируется новое значение. Это так, даже если оператор, содержащий выражение NEXTVAL, завершается с ошибкой.
  • Если оператор INSERT содержит выражение NEXTVAL в списке VALUES для столбца и при выполнении этого оператора в некоторый момент возникла ошибка (это может быть ошибка генерации следующего значения последовательности или ошибка, связанная со значением для другого столбца), операция вставки будет неудачной, но значение, сгенерированное для этой последовательности будет считаться использованным. В некоторых случаях повторное выполнение того же оператора INSERT может быть успешным.

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

  • Если при генерации значения для последовательности превышено максимальное значение для этой последовательности (или минимальное значение для убывающей последовательности) и циклическая генерация не разрешена, возникнет ошибка (SQLSTATE 23522). В этом случае пользователь должен использовать оператор ALTER для этой последовательности, чтобы изменить ее и расширить диапазон допустимых значений или разрешить циклическую генерацию, или отбросить (DROP) эту последовательность и создать (CREATE) новую, с другим типом данных, имеющим больший диапазон значений.

    Например, последовательность может быть определена с типом данных SMALLINT; со временем она исчерпает все возможные значения. Чтобы переопределить эту последовательность как INTEGER, нужно отбросить и заново создать эту последовательность с новым определением.

  • Ссылка на PREVVAL в операторе SELECT для указателя дает значение, сгенерированное для заданной последовательности до открытия указателя. Однако закрытие указателя может повлиять на значения, возвращаемые PREVVAL для заданной последовательности в последующих операторах и даже в том же самом операторе, если указатель открывается повторно. Такая ситуация возникает, если оператор SELECT для указателя содержит ссылку на NEXTVAL с тем же именем последовательности.

Примеры:

В этих примерах подразумевается, что существуют таблица с именем "order" и последовательность с именем "order_seq", созданная следующим образом:

CREATE SEQUENCE order_seq
   START WITH 1
   INCREMENT BY 1
   NOMAXVALUE
   NOCYCLE
   CACHE 24


[ Начало страницы | Страница назад | Страница вперед | Содержание | Индекс ]