Выбор значения последовательности
Функция
Определение оператора получения текущего или следующего значения последовательности.
Спецификация
::=
Синтаксические правила
-
Опция
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
последнего (третьего) запроса.