Oracle использует генератор последовательностей для автоматической генерации уникальной последовательности чисел, которые пользователь может применять в своих операциях. Обычно последовательности используются для создания уникальных чисел для столбца первичного ключа. Рассмотрим генерацию номеров сотрудников при вставке данных.
На заметку! Если бы пользователи вынуждены были создавать последовательные числа программно, то Oracle пришлось бы постоянно блокировать и разблокировать запись, хранящую максимальное значение таких последовательностей, чтобы гарантировать упорядоченное их возрастание. Такая блокировка приводила бы к необходимости ожидания пользователями каждого очередного значения последовательности в транзакциях. Автоматическая генерация последовательностей Oracle повышает степень параллелизма базы данных.
Доступно несколько вариантов создания последовательности. Мы используем простую последовательность vanilla, которая начинается со значения 10 000 и увеличивается каждый раз на 1. Эта последовательность никогда не будет повторяться циклически, поскольку каждый сотрудник должен иметь уникальный номер.
Важно! Существуют два псевдостолбца, именуемые currval и nextval, которые можно использовать для опроса значений последовательности. Псевдостолбец currval дает текущее значение последовательности, а nextval — новое, или следующее, значение последовательности.
Во-первых, создайте последовательность, как показано в следующем примере. Это обычный способ применения последовательности для генерации уникального первичного ключа для столбца.
SQL> CREATE SEQUENCE employee_seq START WITH 10000 INCREMENT BY 1 NOMAXVALUE NOCYCLE; Sequence created. SQL>
Во-вторых, выберите текущий номер последовательности, используя следующий оператор:
SQL> SELECT employee_seq.currval FROM dual;
В-третьих, вставьте новую строку в таблицу employee, используя nextval из последовательности employee_seq:
SQL> INSERT INTO employees(employee_id, first_name, last_name, email, 2 phone_number, hire_date) 3 VALUES 4* (employee_seq.nextval,'sam','alapati','salapati.tnt.org' ,345-555-5555,to_char('21-JUN-2005'); 1 row created. SQL> COMMIT; Commit complete. SQL>
И, наконец, удостоверьтесь, что столбец employee_id был заполнен последовательностью employee_seq:
SQL> SELECT employee_id, first_name, last_name FROM employees WHERE last_name = 'alapati'; EMPLOYEE_ID FIRST_NAME LAST_NAME ------------- ---------------- ---------- 10011 sam alapati SQL>
Обратите внимание, что можно столкнуться с последовательностью Oracle Database, возрастающей непрерывно, но в ее номерах могут быть пропуски. Это связано с тем, что база Oracle всегда сохраняет в памяти 20 значений последовательности (по умолчанию), которые получаются из nextval. Если произойдет сбой базы данных, то номера, находящиеся в памяти, теряются, и в последовательности образуется пропуск.