Создание последовательности (CREATE SEQUENCE)
Функция
Определение оператора создания общей или личной последовательности.
Спецификация
::=[имя схемы.] имя последовательности
[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: -9223372036854775807 и 9223372036854775807; -
INTEGER: -2147483647 и 2147483647; -
SMALLINT: -32767 и 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;