Автоинкрементные поля (счетчики) в Oracle

В Oracle нельзя сделать поле, автоматически увеличивающее свое значение напрямую, как например поле Identity в SQL Server. Поэтому для этих целей обычно используются последовательности (сиквенсы, sequences).
Конечно, сиквенсы не так удобны, но и имеют определенные преимущества. К примеру, сиквенс замечательно подходит для сквозных нумераций в нескольких таблицах.

Синтаксис создания последовательности выглядит так:
CREATE SEQUENCE имя
[START WITH начальное_значение]
[INCREMENT BY значение_инкремента];

Реализуем автоинкремент в Oracle. Cначала создадим сиквенс:

CREATE SEQUENCE my_seq;

CREATE TABLE my_doc (
doc_id NUMBER(20)
, doc_name VARCHAR2(256)
, CONSTRAINT pk_my_table PRIMARY KEY (doc_id)
);

Для получения очередного уникального значения сиквенс может быть использован напрямую, либо через триггер:

1. напрямую

INSERT INTO my_doc (doc_id, doc_name) VALUES (my_seq.nextval, 'Документ 1');

2. через триггер

CREATE OR REPLACE TRIGGER my_trigger
BEFORE INSERT ON my_doc
FOR EACH ROW
BEGIN
SELECT my_seq.NEXTVAL INTO :NEW.doc_id FROM dual;
END;
/

INSERT INTO my_doc (doc_name) VALUES ('Документ 2');
INSERT INTO my_doc (doc_id, doc_name) VALUES (null, 'Документ 3');

В версии Oracle 11g также появилась возможность делать вот так:

CREATE OR REPLACE TRIGGER my_trigger
BEFORE INSERT ON my_doc FOR EACH ROW
BEGIN
:NEW.doc_id := my_seq.NEXTVAL;
END;


Любопытно, что атрибут NEXTVAL, вычисляется не при каждом использовании, а только один раз для каждой очередной строки результата, независимо от того,
сколько раз вызывается NEXTVAL на одну строку.
Попробуйте:

CREATE SEQUENCE seq_1;

CREATE SEQUENCE seq_2 INCREMENT BY 2;

SELECT seq_1.NEXTVAL, seq_1.CURRVAL, seq_1.NEXTVAL, seq_2.CURRVAL, seq_2.NEXTVAL, seq_2.NEXTVAL
FROM all_objects
WHERE ROWNUM <= 10;

NEXTVAL CURRVAL NEXTVAL CURRVAL NEXTVAL NEXTVAL
------- ------- ------- ------- ------- -------
1 1 1 1 1 1
2 2 2 3 3 3
3 3 3 5 5 5
4 4 4 7 7 7
5 5 5 9 9 9
6 6 6 11 11 11
7 7 7 13 13 13
8 8 8 15 15 15
9 9 9 17 17 17
10 10 10 19 19 19