Создание последовательности

Функция

Определение оператора создания общей или личной последовательности.

Спецификация
   
< создание последовательности >::=
CREATE [IF NOT EXISTS | OR REPLACE] [PUBLIC] SEQUENCE
[имя схемы.] имя последовательности
[AS {BIGINT | INTEGER | SMALLINT}]
[START WITH начальное значение]
[INCREMENT BY шаг]
[MAXVALUE верхняя граница | NO MAXVALUE]
[MINVALUE нижняя граница | NO MINVALUE]
[CYCLE | NO CYCLE]
Синтаксические правила
  1. < Имя схемы > задает схему для создания личной последовательности, владельцем которой является пользователь, выполняющий команду.

  2. < Имя последовательности > должно быть уникальным для PUBLIC-последовательностей и в пределах < имени схемы > для личных последовательностей.

  3. Опция OR REPLACE заставляет удалять существующую в БД последовательность и создавать её под тем же именем, но с указанными параметрами.

  4. Опция IF NOT EXISTS отменяет выполнение оператора, если указанная последовательность уже существует в БД.

  5. Одновременное использование опций IF NOT EXISTS и OR REPLACE запрещено.

  6. Если задана опция PUBLIC, последовательность доступна всем пользователям БД.

  7. Указание < имени схемы > для PUBLIC-последовательности недопустимо.

  8. Личная последовательность доступна:

    • с ключом /COMPATIBILITY=STANDARD – только создателю последовательности;

    • без ключа /COMPATIBILITY=STANDARD – всем пользователям.

  9. Если некоторый пользователь является владельцем личной последовательности с < именем последовательности >, то для обращения к PUBLIC-последовательности с тем же < именем последовательности > ему необходимо установить текущую схему, отличную от схемы, в которой создана личная последовательность.

  10. < Начальное значение >, < верхняя граница > и < нижняя граница > – целочисленные значения в диапазоне от -9 223 372 036 854 775 808 до +9 223 372 036 854 775 807 (тип данных BIGINT).

  11. < Шаг > последовательности должен лежать в интервале от -72057594037927936 до 72057594037927935.

  12. Величины < начального значения >, < шага >, < верхней границы > и < нижней границы > не должны логически противоречить друг другу.

  13. < Верхняя граница > имеет смысл при положительном значении < шага >, < нижняя граница > – при отрицательном.

    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 |
  14. Конструкция AS {BIGINT | INTEGER | SMALLINT} задаёт тип возвращаемых последовательностью значений. По умолчанию – BIGINT.

  15. Если используется конструкция AS, то она должна следовать сразу после < имени последовательности >, тогда как все остальные параметры могут располагаться в произвольном порядке.

  16. Конструкция CYCLE | NO CYCLE разрешает/запрещает создавать циклическую последовательность. По умолчанию – NO CYCLE.

  17. Опции NO MAXVALUE и NO MINVALUE автоматически устанавливают нижнюю и верхнюю границы последовательности в зависимости от типа возвращаемого последовательностью значения.

  18. Если опции MAXVALUE и NO MAXVALUE не заданы, по умолчанию используется NO MAXVALUE.

  19. Если опции MINVALUE и NO MINVALUE не заданы, по умолчанию используется NO MINVALUE.

Общие правила
  1. Для создания PUBLIC SEQUENCE необходим уровень прав DBA.

  2. Для создания личной последовательности необходим уровень прав RESOURCE.

  3. Если задана опция CYCLE, и при вызове функции NEXTVAL выявляется выход за пределы интервала между минимальным и максимальным значениями последовательности, то функция NEXTVAL вернёт:

    • минимальное значение последовательности, если значение < шага > последовательности положительно;

    • максимальное значение, если значение < шага > отрицательно.

  4. Если заданы опции NO MAXVALUE и NO MINVALUE (или они используются по умолчанию), то < нижней границе > и < верхней границе > последовательности присваиваются минимальные и максимальные значения для соответствующих возвращаемых типов:

    • BIGINT: -9223372036854775808 и 9223372036854775807;

    • INTEGER: -2147483648 и 2147483647;

    • SMALLINT: -32768 и 32767.

  5. Если задана опция 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|
  6. Если задана опция START WITH, то при создании убывающей последовательности < верхняя граница > устанавливается в < начальное значение > независимо от указаний MAXVALUE < верхняя граница > или NO MAXVALUE.

  7. Для возрастающей последовательности при отсутствии опции START WITH минимальное значение берется равным 1. Для убывающей последовательности минимальное значение задается параметром MINVALUE; если его нет, то берется максимальное по модулю отрицательное значение.

  8. Для убывающей последовательности при отсутствии опции START WITH максимальное значение берется равным -1. Для возрастающей последовательности минимальное значение задается параметром MAXVALUE; если его нет, то берется максимальное положительное значение.

  9. Если опция START WITH не задана, то для возрастающей последовательности стартовым значением берется минимальное значение, для убывающей последовательности – максимальное значение.

  10. Если задана опция START WITH, то для режима nocycle < начальное значение > последовательности должно быть внутри границ последовательности и не совпадать с граничными значениями. В режиме cycle < начальное значение > последовательности может совпадать с граничным значением.

  11. Если заданы опции 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|

  12. Если заданы опции CYCLE и MINVALUE, то при достижении < нижней границы > убывающей последовательности очередным значением последовательности будет MAXVALUE.

  13. Значения последовательностей привязываются не к текущему, а корневому родительскому каналу.

    Например, в хранимой процедуре 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;