Сиквенс (sequences)
Сиквенс - це структура для генерації унікальних цілочисельних значень. Тільки одна сесія може запросить таке значення і таким чином збільшити лічильник. Тому все згенеровані значення будуть унікальними.
Мехнізм сіквенсів не залежить від таблиць, механізму блокувань і транзакцій. Це означає що сиквенс може генерувати тисячі унікальних значень в хвилину - набагато швидше ніж методи вибірки даних, оновлення та підтвердження змін.
На малюнку 7-6 показано як дві сесій вибирають значення з сиквенсу SEQ1. Зверніть увагу що кожен запит SEQ1.NEXTVAL генерує унікальний номер. Значення створюється по порядку в залежності від часу звернення, і значення збільшується глобально а не для однієї сесії.

створення сіквенсів
Повний синтаксис для створення сиквенсу
CREATE SEQUENCE [schema.] Sequencename
[INCREMENT BY number]
[START WITH number]
[MAXVALUE number | NOMAXVALUE]
[MINVALUE number | NOMINVALUE]
[CACHE number | NOCACHE]
Створення сиквенсу може бути дуже простим. Наприклад сиквенс використаний на малюнку 7-6 був створений за допомогою команди
create sequence seq1;
Список доступних параметрів

Директива CYCLE використовується дуже рідко так як дозволяє генерувати дублікати. Якщо сиквенс використовується для генерації значень первинного ключа, CYCLE має сенс тільки є функція в БД яка видаляє старі записи швидше ніж сиквенс генерує нові.
Кешування значень критично для продуктивності. Вибірка з сиквенсу може здійснюватися тільки однією сесією в момент часу. Механізм генерації значень оченята ефективний: він набагато швидше ніж блокування рядки, оновлення рядка або управління транзакцією. Але навіть незважаючи на це, вибірка з сиквенсу може бути точкою конкуренції сесій. Директива CACHE дозволяє Oracle генерувати номера блоками. Пред-згенеровані значення вибираються швидше ніж генерація за запитом.
The default number of values to cache is only 20. Experience shows that this is usually not enough. If your application selects from the sequence 10 times a second, then set the cache value to 50 thousand. Do not be shy about this
Використання сіквенсів
Для використання сиквенсу сесія може запросити наступне значення використовуючи псевдостолбец NEXTVAL, який змушує сиквенс збільшити значення, або запросити останнє (поточний) значення для поточної сесії використовуючи псевдостолбец CURRVAL. Значення NEXTVAL буде глобально унікальним: кожна сесія яка запитує це значення буде отримувати різний, збільшений результат для кожного запиту. Значення CURRVAL буде постійним для кожної сесії поки не буде новий запит до NEXTVAL. Немає можливості дізнатися яке останнє значення було сегенріровано сиквенс: ви можете вибрати тільки таке значення викликавши NEXTVAL, і дізнатися останнім використане значення для вашої сесії використовуючи CURRVAL. Але ви не можете дізнатися останнім сгенерированное значення.
The CURRVAL of a sequence is the last value issued to the current session, not necessarily the last value issued. You can not select the CURRVAL until after selecting the NEXTVAL.
Типовим прикладом використання сиквенсу є генерація значень первинного ключа. Наступний приклад використовує сиквенс ORDER_SEQ для генерації унікальних значень номера замовлення і сиквенс LINE_SEQ для створення унікального значення рядка замовлення. Спочатку створюється сиквенс (один раз)
create sequence order_seq start with 10;
create sequence line_seq start with 10;
Потім вставка замовлення і пунктів замовлення в одній транзакції
insert into orders (order_id, order_date, customer_id)
insert into order_items (order_id, order_item_id, product_id)
insert into order_items (order_id, order_item_id, product_id)
Перша команда INSERT створює замовлення з унікальним номером з сиквенсу ORDER_SEQ для покупця з номером 1000. Потім друга і третя команди INSERT додають два елементи замовлення використовуючи поточне значення сиквенсу ORDER_SEQ як значення для зовнішнього ключа з'єднує елементи замовлення до замовлення і таке значення сиквенсу LINE_SEQ для створення унікального ідентифікатора кожного елемента. І нарешті транзакція підтверджується.
Сиквенс не прив'язаний до якоїсь таблиці. У попередньому прикладі можна використовувати один сиквенс для генерації значень для первинні ключів таблиці замовлень і таблиці елементів замовлення.
COMMIT не обов'язковий для подвтержденія збільшення лічильника: збільшення лічильника станься відразу і назавжди і стає видимим для всіх в момент збільшення. Не можна скасувати збільшення лічильника. Сиквенс оновлюється незалежно від механізму управління транзакціями. Тому завжди будуть зниклі номера. Розриви можуть бути великими якщо БД перезапускается і CACHE директива використовувалася для лічильника. Всі номери які були згенеровані і не вибиралися будуть втрачені в момент вимикання бази даних. Після наступного запуску поточне значення буде останнім сгенерированное, а не останнє використане. Таким чином для значення за замовчуванням 20, кожен перезапуск призводить до втрати 20 номерів.
Якщо бізнес-аналітики вирішили що не може бути розриву в послідовності номерів, тоді можна генерувати унікальний номер по іншому. Для попереднього прикладу замовлень поточний номер замовлення можна зберігати в таблиці з початковим значенням в 10
create table current_on (order_number number);
insert into current_on values (10);
Тоді код для створення замовлення стане наступним
update current_on set order_number = order_number + 1;
insert into orders (order_number, order_date, customer_number)
values ((select order_number from current_on), sysdate, '1000');
Це буде працювати з точки зору створення унікального номера замовлення, і так як збільшення номера замовлення відбувається всередині транзакції то збільшення можна скасувати у разі небходимости: тоді не буде розривів в послідовності, до тих пір поки замовлення не буде свідомо видалений. Але це набагато менш ефективно ніж використання сіквенсів, так як код буде слабо продуктивний в багатокористувацької середовищі. Якщо багато сесій спробують заблокувати і збільшити значення в рядку містить поточний номер замовлення, то все додаток буде подвисать поскльку буде чекати своєї черги.
Після створення сиквенсу він може бути змінена. Синтаксис команди наступний
ALTER SEQUENCE sequencename
[INCREMENT BY number]
[START WITH number]
[MAXVALUE number | NOMAXVALUE]
[MINVALUE number | NOMINVALUE]
[CACHE number | NOCACHE]
Команда ALTER така ж як команда CREATE за одним винятком: не можна встановити початкове значення. Якщо ви хочете оновити початкове значення - то єдиний спосіб це видалити сиквенс і створити новий. Для зміни значення CACHE для збільшення продуктивності можна виконати наступну команду
alter sequence order_seq cache 1000;
Для видалення сиквенсу виконайте команду
drop sequence order_seq;