INTO в Oracle SQL — как сохранять результаты SELECT-запросов

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

В Oracle PL/SQL оператор INTO позволяет передать данные, полученные в результате запроса SELECT, в переменные или записи. Это важнейшая часть любого SQL-блока в PL/SQL, где нужно обработать результат запроса программно.


🔤 Написание

sql
SELECT столбец
INTO переменная
FROM таблица
WHERE ...;

💡 Если в результате SELECT будет возвращено больше одной строки — произойдёт ошибка.


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

  • Внутри анонимных блоков BEGIN ... END

  • В процедурах и функциях

  • В триггерах

  • При условной логике на основе результата запроса

  • Для считывания значений из таблиц


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

1️⃣ Простое присваивание переменной

sql
DECLARE
v_name employees.name%TYPE;
BEGIN
SELECT name INTO v_name FROM employees WHERE id = 100;
DBMS_OUTPUT.PUT_LINE('Имя: ' || v_name);
END;

Записываем имя сотрудника в переменную.


2️⃣ Присваивание нескольких значений

sql
DECLARE
v_name employees.name%TYPE;
v_salary employees.salary%TYPE;
BEGIN
SELECT name, salary INTO v_name, v_salary
FROM employees WHERE id = 101;
END;

Результат запроса — в две переменные.


3️⃣ Использование INTO с типами %TYPE

sql
DECLARE
v_dept employees.department_id%TYPE;
BEGIN
SELECT department_id INTO v_dept FROM employees WHERE id = 102;
END;

Тип переменной унаследован от таблицы.


4️⃣ INTO с SELECT COUNT

sql
DECLARE
v_total NUMBER;
BEGIN
SELECT COUNT(*) INTO v_total FROM employees WHERE department_id = 50;
END;

Получаем количество сотрудников в отделе.


5️⃣ INTO с выражениями

sql
DECLARE
v_bonus NUMBER;
BEGIN
SELECT salary * 0.1 INTO v_bonus FROM employees WHERE id = 103;
END;

Вычисляем значение прямо в запросе.


6️⃣ INTO с пользовательским RECORD

sql
DECLARE
TYPE emp_rec IS RECORD (
name employees.name%TYPE,
salary employees.salary%TYPE
);
v_emp emp_rec;
BEGIN
SELECT name, salary INTO v_emp.name, v_emp.salary FROM employees WHERE id = 104;
END;

Записываем результат в составной тип.


7️⃣ Обработка исключения TOO_MANY_ROWS

sql
BEGIN
SELECT name INTO :name_var FROM employees WHERE department_id = 10;
EXCEPTION
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('Ошибка: слишком много строк!');
END;

Обязательно обрабатывайте исключения.


8️⃣ INTO с переменными OUT параметров

sql
PROCEDURE get_salary(p_id NUMBER, p_salary OUT NUMBER) IS
BEGIN
SELECT salary INTO p_salary FROM employees WHERE id = p_id;
END;

Используется при возврате значений из процедуры.


9️⃣ INTO в цикле FOR — не требуется

sql
FOR rec IN (SELECT name FROM employees) LOOP
DBMS_OUTPUT.PUT_LINE(rec.name);
END LOOP;

Внутри FOR LOOP INTO не нужен.


🔟 Ошибка NO_DATA_FOUND

sql
BEGIN
SELECT salary INTO :v_salary FROM employees WHERE id = 9999;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Сотрудник не найден');
END;

Если ничего не найдено — возникнет исключение.


🧩 Заключение

Оператор INTO — это связующее звено между SQL-запросами и переменными в PL/SQL. Он позволяет «захватить» результат SQL и использовать его в логике программы.

💡 Запомни:

  • INTO используется только с SELECT и только в PL/SQL

  • Запрос должен вернуть ровно одну строку

  • Поддерживает как простые переменные, так и RECORD

  • Вызывает ошибки TOO_MANY_ROWS или NO_DATA_FOUND

  • Является основой любой логики на основе SQL-результатов


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

MERGE в Oracle SQL — как объединить INSERT и UPDATE


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