Выбор значения последовательности (CURRVAL/NEXTVAL)
Функция
Определение оператора получения текущего или следующего значения последовательности.
Спецификация
::=Синтаксические правила
-
Опция
NEXTVALпредоставляет следующее значение последовательности. -
Опция
CURRVALпредоставляет текущее значение последовательности. -
Конструкция
<выбор значения последовательности>может использоваться:-
в 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); -
-
В случае если в 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): -
Запрещено использование
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;
Общие правила
-
Перед первым после открытия соединения с БД получением CURRVAL-значения необходимо установить следующее значение последовательности, т.е. получить NEXTVAL-значение. Данная операция должна выполняться для каждого соединения.
-
Все NEXTVAL-значения, запрошенные в одном SQL-запросе, возвращают одно и то же значение для одной строки ответа. Для каждой следующей строки ответа значение
NEXTVALбудет другим. Для получения действительно следующего значения надо использовать новый SQL-запрос.select SEQ.NEXTVAL, SEQ.NEXTVAL, SEQ.NEXTVAL; | 10| 10| 10| select SEQ.NEXTVAL; | 11|
-
Запрещено использование
NEXTVALв<WHERE-спецификации>. -
В
<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последнего (третьего) запроса.