NEXTVAL и CURRVAL в Oracle SQL: автоматическая генерация уникальных значений из последовательностей

🟢 NEXTVAL и CURRVAL в Oracle SQL. Введение

Если вам нужно автоматически генерировать уникальные значения, например, для ID в таблице — используйте последовательности.

Последовательность (SEQUENCE) — это объект базы данных, который создаёт монотонно возрастающие (или убывающие) числа.
А получить очередное или текущее значение можно через:

  • NEXTVAL — получить следующее значение

  • CURRVAL — получить текущее значение (после вызова NEXTVAL)


🔤 Написание

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

sql
CREATE SEQUENCE user_seq
START WITH 1
INCREMENT BY 1
NOCACHE;

Получение значения:

sql
user_seq.NEXTVAL -- следующее значение
user_seq.CURRVAL -- текущее значение

🔄 Где часто используется

  • Генерация первичных ключей

  • Нумерация заказов, транзакций, сообщений

  • Протоколирование операций

  • Автоматизация вставки данных

  • При миграции данных без конфликтов


🧪 10 Примеров использования NEXTVAL и CURRVAL с пояснениями

1️⃣ Простое получение NEXTVAL

sql
SELECT user_seq.NEXTVAL FROM dual;

Получаем следующее значение из последовательности.


2️⃣ CURRVAL после NEXTVAL

sql
SELECT user_seq.NEXTVAL FROM dual; -- нужно сначала вызвать
SELECT user_seq.CURRVAL FROM dual;

CURRVAL вернёт то же значение, что было в NEXTVAL.


3️⃣ Вставка новой строки с NEXTVAL

sql
INSERT INTO users (user_id, username)
VALUES (user_seq.NEXTVAL, 'new_user');

Автоматическая генерация ID при вставке.


4️⃣ Использование NEXTVAL в SELECT INTO

sql
DECLARE
v_id NUMBER;
BEGIN
SELECT user_seq.NEXTVAL INTO v_id FROM dual;
DBMS_OUTPUT.PUT_LINE('Generated ID: ' || v_id);
END;

Сохраняем значение последовательности в переменную.


5️⃣ NEXTVAL в массовой вставке

sql
INSERT INTO orders (order_id, customer_id)
SELECT user_seq.NEXTVAL, c.customer_id FROM customers c;

Создание заказов с уникальными ID для каждого клиента.


6️⃣ Создание последовательности с настраиваемыми параметрами

sql
CREATE SEQUENCE invoice_seq
START WITH 1000
INCREMENT BY 10
MAXVALUE 999999
CYCLE
NOCACHE;

Последовательность с шагом 10 и циклическим поведением.


7️⃣ CURRVAL без вызова NEXTVAL — ошибка!

sql
SELECT user_seq.CURRVAL FROM dual;
-- ORA-08002: sequence CURRVAL is not yet defined in this session

CURRVAL можно использовать только после вызова NEXTVAL.


8️⃣ Использование NEXTVAL при импорте данных

sql
INSERT INTO imported_data (id, data)
SELECT user_seq.NEXTVAL, raw_data
FROM staging_table;

Каждой записи присваиваем уникальный ID.


9️⃣ Отображение значения CURRVAL после вставки

sql

INSERT INTO employees (id, name) VALUES (user_seq.NEXTVAL, 'Alex');

SELECT user_seq.CURRVAL FROM dual;

Получаем ID, который только что использовали.


🔟 NEXTVAL в PL/SQL блоке с логикой

sql
DECLARE
v_id NUMBER := user_seq.NEXTVAL;
BEGIN
INSERT INTO logs (log_id, message)
VALUES (v_id, 'Inserted with sequence');
END;

Генерация ID + использование внутри процедуры.


🧩 NEXTVAL и CURRVAL в Oracle SQL. Заключение

Операторы NEXTVAL и CURRVAL — основной способ генерировать уникальные значения в Oracle SQL.
Они работают в связке с объектом SEQUENCE и являются неотъемлемой частью большинства транзакционных и производственных систем.

💡 Запомните:

  • NEXTVAL — обязательно перед использованием CURRVAL

  • Вызываются через sequence_name.NEXTVAL

  • Работают независимо от таблиц

  • Удобны для массовых вставок и потоков данных


🔜 Следующая статья:

CONNECT_BY_ISCYCLE в Oracle SQL — как определить зацикленные иерархии


Понравилась статья? Поделиться с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии