CURRVAL в Oracle SQL — как получить последнее значение

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

Oracle предоставляет два оператора для работы с последовательностями:

  • NEXTVAL — генерирует новое значение

  • CURRVAL — возвращает текущее значение, уже полученное через NEXTVAL

Оператор CURRVAL особенно полезен, когда:

  • Нужно использовать значение, уже вставленное в таблицу

  • Нужно сохранить ссылку на последний вставленный ID

  • Необходимо избежать повторного увеличения счётчика


🔤 Написание

sql
sequence_name.CURRVAL

💡 Но: CURRVAL можно использовать только после вызова NEXTVAL в рамках текущей сессии, иначе будет ошибка.


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

  • Сразу после вставки строки с NEXTVAL

  • При вставке в связанные таблицы (master-detail)

  • В PL/SQL для повторного использования значения

  • В логике транзакций, где нужно одно значение для нескольких действий


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

1️⃣ КУРВАЛЛ + CURRVAL в одной транзакции

sql
INSERT INTO customers (id, name)
VALUES (cust_seq.NEXTVAL, 'Anna');
INSERT INTO customer_logs (customer_id, action)
VALUES (cust_seq.CURRVAL, ‘Created’);

Сначала генерируем ID, потом используем его повторно.


2️⃣ КУРВАЛЛ в SELECT после NEXTVAL

sql
SELECT cust_seq.CURRVAL FROM dual;

Получаем последнее значение, вызванное ранее.


3️⃣ КУРВАЛЛ без NEXTVAL — ошибка

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

Нельзя вызывать CURRVAL до NEXTVAL.


4️⃣ Вставка в связанную таблицу

sql
-- Заказ
INSERT INTO orders (order_id, customer_id)
VALUES (orders_seq.NEXTVAL, 101);
— Строки заказа
INSERT INTO order_lines (order_id, product_id, qty)
VALUES (orders_seq.CURRVAL, 2001, 2);

Сохраняем связь между главной и дочерней таблицей.


5️⃣ КУРВАЛЛ в PL/SQL переменной

sql
DECLARE
v_id NUMBER;
BEGIN
SELECT orders_seq.CURRVAL INTO v_id FROM dual;
END;

Сохраняем значение CURRVAL в переменную.


6️⃣ КУРВАЛЛ после вызова NEXTVAL внутри блока

sql
BEGIN
INSERT INTO employees (id, name)
VALUES (emp_seq.NEXTVAL, 'Oleg');
DBMS_OUTPUT.PUT_LINE(‘ID: ‘ || emp_seq.CURRVAL);
END;

Выводим ID, присвоенный новой записи.


7️⃣ Вставка и логгирование с КУРВАЛЛ

sql

INSERT INTO clients (id, name) VALUES (client_seq.NEXTVAL, 'Irina');

INSERT INTO logs (entity_id, description)
VALUES (client_seq.CURRVAL, ‘Created client’);

Используем ID клиента для записи в журнал.


8️⃣ КУРВАЛЛ внутри функции

sql
FUNCTION get_last_id RETURN NUMBER IS
BEGIN
RETURN my_seq.CURRVAL;
END;

Оборачиваем CURRVAL в функцию.


9️⃣ КУРВАЛЛ в MERGE для дочерних строк

sql
MERGE INTO orders t
USING dual s
ON (1 = 0)
WHEN NOT MATCHED THEN
INSERT (order_id) VALUES (orders_seq.NEXTVAL);
INSERT INTO order_audit (order_id, info)
VALUES (orders_seq.CURRVAL, ‘Created’);

Используем CURRVAL после MERGE + INSERT.


🔟 КУРВАЛЛ + пакетная вставка

sql
FOR i IN 1..3 LOOP
INSERT INTO items (id, name) VALUES (item_seq.NEXTVAL, 'Item #' || i);
DBMS_OUTPUT.PUT_LINE('Inserted ID: ' || item_seq.CURRVAL);
END LOOP;

Каждая итерация имеет собственное значение CURRVAL.


🧩 Заключение

Оператор CURRVAL в Oracle SQL позволяет безопасно и удобно повторно использовать уже сгенерированное значение из последовательности, не вызывая её повторно. Это упрощает вставку данных и логирование.

💡 Запомни:

  • CURRVAL всегда зависит от вызова NEXTVAL в текущей сессии

  • Вызывает ошибку, если NEXTVAL не был вызван

  • Удобен для использования в связанных таблицах и логах

  • Работает в SQL и в PL/SQL


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

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


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