Доступные версии документации

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

Функция

Определение оператора получения текущего или следующего значения последовательности.

Спецификация
     
<выбор значения последовательности>::=
Синтаксические правила
  1. Опция NEXTVAL предоставляет следующее значение последовательности.

  2. Опция CURRVAL предоставляет текущее значение последовательности.

  3. Конструкция <выбор значения последовательности> может использоваться:

    • в SELECT-запросах в качестве псевдостолбца и в условии WHERE;

    • в UPDATE-запросах в конструкции SET и в условии WHERE;

    • в INSERT-запросах в конструкции VALUES;

    • в DELETE-запросах в конструкции WHERE.

    create table "Платежные поручения"
    ("Номер ПП" char (8), "Дата" date, "Получатель" varchar(50), "Сумма" decimal);
    CREATE PUBLIC SEQUENCE
    "Номера платежных поручений"
    START WITH 1
    INCREMENT BY 1;
    select "Номера платежных поручений".nextval;
    
    insert into "Платежные поручения"
    ("Номер ПП", "Дата", "Получатель", "Сумма") values 
    (to_char(sysdate,'yyyy')|| cast("Номера платежных поручений".currval as char(4)), sysdate,
    'Администрация Советского района', 4597.0);
  4. В случае если в SQL-запросе использованы ключевые слова NEXTVAL и CURRVAL, а последовательность не найдена, предполагается, что NEXTVAL и CURRVAL – имена столбцов.

    create or replace table test ("NEXTVAL" int,"CURRVAL" int);
    create or replace sequence test;
    insert into test("CURRVAL","NEXTVAL") values (100,200);
    
    select test."CURRVAL",test."NEXTVAL" from test;
    ! result (1,1):
    
    drop sequence test;
    select test."CURRVAL",test."NEXTVAL" from test;
    ! result (100,200):
    
    select "CURRVAL","NEXTVAL" from test;
    ! result (100,200):
  5. Запрещено использование NEXTVAL в запросе с UNION и/или DISTINCT, но разрешено использование с UNION ALL.

    create or replace sequence test;
    SELECT test.NEXTVAL UNION ALL SELECT test.NEXTVAL;
    !result - 2 records (1) & (2):
    
    SELECT test.NEXTVAL UNION SELECT test.NEXTVAL;
    !error 1102:
    
    SELECT DISTINCT test.NEXTVAL FROM AUTO;
    !error 1102:
    
    drop sequence test;
Общие правила
  1. Перед первым после открытия соединения с БД получением CURRVAL-значения необходимо установить следующее значение последовательности, т.е. получить NEXTVAL-значение. Данная операция должна выполняться для каждого соединения.

  2. Все NEXTVAL-значения, запрошенные в одном SQL-запросе, возвращают одно и то же значение для одной строки ответа. Для каждой следующей строки ответа значение NEXTVAL будет другим. Для получения действительно следующего значения надо использовать новый SQL-запрос.

    select SEQ. NEXTVAL, SEQ. NEXTVAL, SEQ. NEXTVAL;
    |  10| 10| 10|
    select SEQ. NEXTVAL;
    | 11|
  3. Запрещено использование NEXTVAL в <WHERE-спецификации>.

  4. В <WHERE-спецификации> используется то значение CURRVAL, которое было установлено перед выполнением запроса. Если значение CURRVAL не было установлено, будет выдан код завершения 1102 («Текущее значение последовательности не установлено»). Т.е. если используется запрос вида

    select "TEST".NEXTVAL, "TEST".CURRVAL from AUTO where rowid < "TEST".CURRVAL;

    то надо понимать, что значения "TEST".CURRVAL в секциях SELECT и WHERE разные: первое значение в секции SELECT будет отличаться от значения в секции WHERE на величину шага последовательности.

Пример
DROP SEQUENCE "TEST";
CREATE SEQUENCE "TEST";
!Код завершения  1102:
select rowid,"TEST".NEXTVAL, "TEST".CURRVAL from AUTO where rowid <
 "TEST".CURRVAL;

!3 записи с  rowid 1,2,3:
select rowid,"TEST".NEXTVAL, "TEST".CURRVAL from AUTO where rowid < 4;
 ROWID
 -----
| 1| 1| 1|
| 2| 2| 2|
| 3| 3| 3|

!2 записи с  rowid 1,2:
select rowid,"TEST".NEXTVAL, "TEST".CURRVAL from AUTO where rowid <
 "TEST".CURRVAL;
 ROWID
 -----
| 1| 4| 4|
| 2| 5| 5|
Т.е. после второго SELECT-запроса значение CURRVAL стало равно 3 и именно это
 значение было использовано в условии WHERE последнего (третьего) запроса.
Заметили ошибку?
Выделите текст и нажмите Ctrl + Enter