21 февраля 2011 г.

oracle: sequence

Sequence (последовательность)
A sequence is a database object that generates unique numbers, mostly used for primary key values.

В Oracle для поля нет атрибута AUTO_INCREMENT как в MySQL.
Вместо этого используются последовательности.



Посмотреть список последовательностей, которые есть в схеме
select * from user_sequences;

Создать/модифицировать/удалить последовательность
create sequence t_seq;
создаётся последовательность с параметрами по-умолчанию(начинается с 1 инкремент на 1)

alter sequence t_seq increment by 2;
drop sequence t_seq;

Можно более детально указать параметры
CREATE SEQUENCE my_sequence
   MINVALUE 1
   MAXVALUE 1000
   START WITH 1
   INCREMENT BY 2
   CACHE 5;


Посмотреть значение последовательности

select t_seq.nextval from dual;               // следующее
select t_seq.currval from dual;               // текущее

Важно!
Каждый запрос  select t_seq.nextval from dual увеличивает последовательность на величину инкремента


Сразу после создания последовательность не имеет никакого значения,
если сделать, то получим ошибку: 
select t_seq.currval from dual;
ORA-08002: sequence T_SEQ.CURRVAL is not yet defined in this session

Необходимо сначала сделать
select t_seq.nextval from dual;
и тогда  
select t_seq.currval from dual;
вернёт 1


Увеличить текущее значение последовательности
Если нужно увеличить значение последоватести скажем на 10000, то можно
сделать это несколькими методами
1. Процедурой:
sql>select T_SEQ.currval from dual;
   CURRVAL
   ----------
    140000


Процедура
declare
  CurrValue integer;
begin
  loop
    select T_SEQ.currval into CurrValue from dual;
    exit when CurrValue >= 150000;
    select T_SEQ.nextval into CurrValue from dual;
  end loop;
end;

2. Запросом:
SQL> ALTER SEQUENCE t_seq1 INCREMENT BY 10000;
SQL> SELECT t_seq1.nextval FROM dual;
SQL> ALTER SEQUENCE t_seq1 INCREMENT BY 1;