Создание последовательности
Функция
Определение оператора создания общей или личной последовательности.
Спецификация
::=
[имя схемы.] имя последовательности
[AS {BIGINT | INTEGER | SMALLINT}]
[START WITH начальное значение]
[INCREMENT BY шаг]
[MAXVALUE верхняя граница | NO MAXVALUE]
[MINVALUE нижняя граница | NO MINVALUE]
[CYCLE | NO CYCLE]
::=
Синтаксические правила
-
< Имя схемы >
задает схему для создания личной последовательности, владельцем которой является пользователь, выполняющий команду. -
< Имя последовательности >
должно быть уникальным для PUBLIC-последовательностей и в пределах< имени схемы >
для личных последовательностей. -
Опция
OR REPLACE
заставляет удалять существующую в БД последовательность и создавать её под тем же именем, но с указанными параметрами. -
Опция
IF NOT EXISTS
отменяет выполнение оператора, если указанная последовательность уже существует в БД. -
Одновременное использование опций
IF NOT EXISTS
иOR REPLACE
запрещено. -
Если задана опция
PUBLIC
, последовательность доступна всем пользователям БД. -
Указание
< имени схемы >
для PUBLIC-последовательности недопустимо. -
Личная последовательность доступна:
-
с ключом
/COMPATIBILITY=STANDARD
– только создателю последовательности; -
без ключа
/COMPATIBILITY=STANDARD
– всем пользователям.
-
-
Если некоторый пользователь является владельцем личной последовательности с
< именем последовательности >
, то для обращения к PUBLIC-последовательности с тем же< именем последовательности >
ему необходимо установить текущую схему, отличную от схемы, в которой создана личная последовательность. -
< Начальное значение >
,< верхняя граница >
и< нижняя граница >
– целочисленные значения в диапазоне от -9 223 372 036 854 775 808 до +9 223 372 036 854 775 807 (тип данныхBIGINT
). -
< Шаг >
последовательности должен лежать в интервале от -72057594037927936 до 72057594037927935. -
Величины
< начального значения >
,< шага >
,< верхней границы >
и< нижней границы >
не должны логически противоречить друг другу. -
< Верхняя граница >
имеет смысл при положительном значении< шага >
,< нижняя граница >
– при отрицательном.CREATE PUBLIC SEQUENCE "Номера платежных поручений" START WITH 1 INCREMENT BY 1; select "Номера платежных поручений".NEXTVAL; |2 | CREATE SEQUENCE My_Seq INCREMENT BY -5 MINVALUE -273; select My_Seq. NEXTVAL; |-6 |
-
Конструкция
AS {BIGINT | INTEGER | SMALLINT}
задаёт тип возвращаемых последовательностью значений. По умолчанию –BIGINT
. -
Если используется конструкция
AS
, то она должна следовать сразу после< имени последовательности >
, тогда как все остальные параметры могут располагаться в произвольном порядке. -
Конструкция
CYCLE | NO CYCLE
разрешает/запрещает создавать циклическую последовательность. По умолчанию –NO CYCLE
. -
Опции
NO MAXVALUE
иNO MINVALUE
автоматически устанавливают нижнюю и верхнюю границы последовательности в зависимости от типа возвращаемого последовательностью значения. -
Если опции
MAXVALUE
иNO MAXVALUE
не заданы, по умолчанию используетсяNO MAXVALUE
. -
Если опции
MINVALUE
иNO MINVALUE
не заданы, по умолчанию используетсяNO MINVALUE
.
Общие правила
-
Для создания
PUBLIC SEQUENCE
необходим уровень прав DBA. -
Для создания личной последовательности необходим уровень прав
RESOURCE
. -
Если задана опция
CYCLE
, и при вызове функцииNEXTVAL
выявляется выход за пределы интервала между минимальным и максимальным значениями последовательности, то функцияNEXTVAL
вернёт:-
минимальное значение последовательности, если значение
< шага >
последовательности положительно; -
максимальное значение, если значение
< шага >
отрицательно.
-
-
Если заданы опции
NO MAXVALUE
иNO MINVALUE
(или они используются по умолчанию), то< нижней границе >
и< верхней границе >
последовательности присваиваются минимальные и максимальные значения для соответствующих возвращаемых типов:-
BIGINT
: -9223372036854775808 и 9223372036854775807; -
INTEGER
: -2147483648 и 2147483647; -
SMALLINT
: -32768 и 32767.
-
-
Если задана опция
START WITH
, то при создании возрастающей последовательности< нижняя граница >
устанавливается в< начальное значение >
независимо от указанийMINVALUE < нижняя граница >
илиNO MINVALUE
.create or replace sequence my_seq start with 100 minvalue -500 no maxvalue increment by 5; select my_seq.nextval; select my_seq.currval; | 100|
-
Если задана опция
START WITH
, то при создании убывающей последовательности< верхняя граница >
устанавливается в< начальное значение >
независимо от указанийMAXVALUE < верхняя граница >
илиNO MAXVALUE
. -
Для возрастающей последовательности при отсутствии опции
START WITH
минимальное значение берется равным 1. Для убывающей последовательности минимальное значение задается параметромMINVALUE
; если его нет, то берется максимальное по модулю отрицательное значение. -
Для убывающей последовательности при отсутствии опции
START WITH
максимальное значение берется равным -1. Для возрастающей последовательности минимальное значение задается параметромMAXVALUE
; если его нет, то берется максимальное положительное значение. -
Если опция
START WITH
не задана, то для возрастающей последовательности стартовым значением берется минимальное значение, для убывающей последовательности – максимальное значение. -
Если задана опция
START WITH
, то для режима nocycle< начальное значение >
последовательности должно быть внутри границ последовательности и не совпадать с граничными значениями. В режиме cycle< начальное значение >
последовательности может совпадать с граничным значением. -
Если заданы опции
CYCLE
иMINVALUE
, то при достижении< верхней границы >
возрастающей последовательности очередным значением последовательности будетMINVALUE
.create or replace sequence my_seq start with 2 minvalue 1 maxvalue 3 increment by 1 cycle; select my_seq.nextval; select my_seq.nextval; select my_seq.nextval; select my_seq.nextval; select my_seq.nextval; | 1| | 2| | 3| | 1| | 2| | 3|
-
Если заданы опции
CYCLE
иMINVALUE
, то при достижении< нижней границы >
убывающей последовательности очередным значением последовательности будетMAXVALUE
. -
Значения последовательностей привязываются не к текущему, а корневому родительскому каналу.
Например, в хранимой процедуре test_prc() (выполняется по дочернему каналу) перед запросом seq.currval нет необходимости запрашивать seq.nextval, т.к. это было уже сделано в родительском канале (т.е. дочерний канал хранимой процедуры использует значение последовательности, взятое из родительского канала). SQL_скрипт tst.sql: create or replace table test1(i bigint, val1 int); create or replace sequence test1_seq start with 1 increment by 1; create or replace table test2(i bigint, val2 int); create or replace sequence test2_seq start with 1 increment by 1; create or replace table test3(i1 bigint, i2 bigint, i bigint, val3 int); create or replace sequence test3_seq start with 1 increment by 1; create or replace procedure test_prc() result int code execute direct "insert into test3 values(test1_seq.currval, test2_seq.currval, test3_seq.nextval, 3);"; // return errcode(); // end; insert into test1 values(test1_seq.nextval,?); 1 insert into test2 values(test2_seq.nextval, ?); 2 execute test_prc(); select * from test1; select * from test2; select * from test3; Выполнение sql-скрипта: >inl -u SYSTEM/MANAGER8 -f tst I VAL1 | 1| 1| I VAL2 | 1| 2| I1 I2 I VAL3 | 1| 1| 1| 3|
Примеры
create or replace sequence INT_PLUS_C as integer start with 7 increment by 2 minvalue 7 maxvalue 15 cycle; create or replace sequence INT_MINUS_C as integer start with 20 increment by -3 minvalue 7 maxvalue 20 cycle;