RETURNING INTO в Oracle SQL — как получить значения после INSERT

🟢RETURNING INTO в Oracle SQL. Введение

После выполнения INSERT, UPDATE или DELETE вы можете захотеть узнать, что именно изменилось. Вместо выполнения второго запроса для получения ID, даты или нового значения, Oracle позволяет использовать RETURNING INTO, чтобы сразу сохранить данные в переменные.

Это:

  • Уменьшает количество запросов

  • Повышает производительность

  • Упрощает код


🔤 Написание

sql
INSERT ... RETURNING поле INTO переменная;
UPDATE ... RETURNING поле INTO переменная;
DELETE ... RETURNING поле INTO переменная;

🧮 Пример:

sql
INSERT INTO employees (id, name) VALUES (employees_seq.NEXTVAL, 'John')
RETURNING id INTO v_id;

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

  • Получение ID новой записи

  • Получение значений после изменения строки

  • Удаление с возвратом удалённого значения

  • Упрощение бизнес-логики без дополнительных SELECT

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


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

1️⃣ Получение ID после INSERT

sql
DECLARE
v_id employees.id%TYPE;
BEGIN
INSERT INTO employees (id, name)
VALUES (employees_seq.NEXTVAL, 'Anna')
RETURNING id INTO v_id;
DBMS_OUTPUT.PUT_LINE(‘Создан сотрудник с ID: ‘ || v_id);
END;

Запоминаем ID новой строки без SELECT.


2️⃣ Получение нового значения после UPDATE

sql
DECLARE
v_salary employees.salary%TYPE;
BEGIN
UPDATE employees
SET salary = salary * 1.1
WHERE employee_id = 101
RETURNING salary INTO v_salary;
DBMS_OUTPUT.PUT_LINE(‘Новая зарплата: ‘ || v_salary);
END;

Изменили — и сразу знаем результат.


3️⃣ Возврат удалённого значения

sql
DECLARE
v_name employees.name%TYPE;
BEGIN
DELETE FROM employees
WHERE employee_id = 103
RETURNING name INTO v_name;
DBMS_OUTPUT.PUT_LINE(‘Удалён сотрудник: ‘ || v_name);
END;

Запоминаем, кого удалили.


4️⃣ Работа с несколькими полями

sql
DECLARE
v_name employees.name%TYPE;
v_salary employees.salary%TYPE;
BEGIN
UPDATE employees
SET salary = salary + 500
WHERE employee_id = 102
RETURNING name, salary INTO v_name, v_salary;
DBMS_OUTPUT.PUT_LINE(v_name || ‘ теперь получает ‘ || v_salary);
END;

Можно вернуть сразу несколько значений.


5️⃣ Использование в процедуре

sql
PROCEDURE create_dept(p_name VARCHAR2, p_id OUT NUMBER) IS
BEGIN
INSERT INTO departments (department_id, department_name)
VALUES (dept_seq.NEXTVAL, p_name)
RETURNING department_id INTO p_id;
END;

Простая и быстрая регистрация с возвратом.


6️⃣ RETURNING в BULK операциях — не работает

sql
-- Нельзя использовать RETURNING INTO при UPDATE, DELETE с BULK COLLECT
-- Только одиночные изменения

Важно: работает только при 1-строчных операциях.


7️⃣ RETURNING с WHERE … RETURNING

sql
UPDATE products
SET price = price * 1.2
WHERE id = 500
RETURNING price INTO v_new_price;

Обновили и сразу узнали цену.


8️⃣ RETURNING с INTO RECORD

sql
DECLARE
TYPE emp_rec IS RECORD (
id employees.id%TYPE,
name employees.name%TYPE
);
v_emp emp_rec;
BEGIN
INSERT INTO employees (id, name)
VALUES (employees_seq.NEXTVAL, 'Olga')
RETURNING id, name INTO v_emp.id, v_emp.name;
END;

Можно записать в составную структуру.


9️⃣ RETURNING INTO при удалении строки

sql
DELETE FROM orders
WHERE order_id = 123
RETURNING customer_id INTO v_cust;

Сохраняем ключ перед удалением.


🔟 RETURNING с типами %TYPE

sql
DECLARE
v_id employees.id%TYPE;
BEGIN
INSERT INTO employees (id, name)
VALUES (employees_seq.NEXTVAL, 'Max')
RETURNING id INTO v_id;
END;

Автоматически унаследованный тип из таблицы.


🧩 Заключение

RETURNING INTO — это мощный способ упростить логику работы с БД, избегая дополнительных SELECT и ускоряя выполнение. Особенно полезен при создании, обновлении и удалении данных.

💡 Запомни:

  • Используется только с INSERT, UPDATE, DELETE

  • Работает с одиночными строками

  • Возвращает данные прямо в переменные

  • Можно вернуть несколько полей

  • Отлично сочетается с процедурами


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

RETURN в Oracle SQL — как завершать процедуры и возвращать значения из функций в PL/SQL


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