📖 Теория
⚡ Кратко: 📖 теория
Параметры процедуры позволяют передавать данные в процедуру и получать результат обратно.
IN используется для входных значений: процедура читает аргумент и строит по нему запрос.
OUT используется для результата: процедура записывает значение в переменную вызывающего кода через SELECT ... INTO или SET.
INOUT совмещает оба направления: начальное значение приходит в процедуру, изменённое значение возвращается наружу.
Для OUT и INOUT в MySQL обычно передают пользовательские переменные вида @salary.
Минимальный пример: CALL get_employee_salary(1, @salary); SELECT @salary;.
Топ-3 ошибки: вызвать процедуру без CALL, передать литерал вместо переменной в OUT, забыть присвоить значение выходному параметру внутри процедуры.
Зачем процедурам параметры
Источник занятия продолжает тему хранимых процедур и показывает три направления параметров: IN, OUT и INOUT. Без параметров процедура всегда выполняет один и тот же сценарий. С параметрами она становится переиспользуемой: можно искать разных сотрудников, возвращать рассчитанную зарплату или менять переданное значение.
Для практики в источнике используется учебная MySQL-база с доступом на запись: ich-edit.edu.itcareerhub.de. Пароли из LMS не повторяются как рекомендация для реальных проектов: в рабочих системах их хранят в менеджере секретов или переменных окружения.
IN: входной параметр
IN передаёт значение в процедуру. В примере из источника emp_id нужен, чтобы отфильтровать таблицу employees по конкретному сотруднику.
DELIMITER $$
CREATE PROCEDURE get_employee_name(IN emp_id INT)
BEGIN
SELECT name
FROM employees
WHERE id = emp_id;
END $$
DELIMITER ;
CALL get_employee_name(1);
Почему запрос написан так: WHERE id = emp_id связывает строку таблицы с аргументом процедуры. Если передать другой emp_id, сама процедура останется той же.
OUT: выходной параметр
OUT возвращает значение вызывающему коду. Внутри процедуры значение нужно явно присвоить. В MySQL для получения результата удобно использовать переменную с префиксом @.
DELIMITER $$
CREATE PROCEDURE get_employee_salary(IN emp_id INT, OUT emp_salary INT)
BEGIN
SELECT salary
INTO emp_salary
FROM employees
WHERE id = emp_id;
END $$
DELIMITER ;
SET @salary = 0;
CALL get_employee_salary(1, @salary);
SELECT @salary;
SELECT ... INTO emp_salary выбран потому, что результат запроса должен попасть не в таблицу результатов, а в параметр процедуры.
INOUT: вход и выход одновременно
INOUT получает начальное значение, изменяет его внутри процедуры и возвращает наружу. Источник показывает сценарий с увеличением зарплаты или бонуса.
DELIMITER $$
CREATE PROCEDURE increase_bonus(INOUT bonus_amount DECIMAL(10, 2))
BEGIN
SET bonus_amount = bonus_amount * 1.15;
END $$
DELIMITER ;
SET @bonus = 1000.00;
CALL increase_bonus(@bonus);
SELECT @bonus;
Сравнение типов параметров
| Тип | Передаёт в процедуру | Возвращает из процедуры | Можно менять внутри |
|---|---|---|---|
IN | Да | Нет | Только локально, наружу не вернётся |
OUT | Нет | Да | Да, значение задаёт процедура |
INOUT | Да | Да | Да, новое значение вернётся вызывающему коду |
Синтаксис параметров процедур отличается в PostgreSQL, SQL Server и Oracle. В этом занятии все исполняемые примеры ориентированы на MySQL.