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