← К оглавлению занятия

📖 Теория

📁 Блок: SQL / MySQL / Хранимые процедуры ⏱️ Время изучения: ~90 мин 🎯 Сложность: Продвинутая

⚡ Кратко: 📖 теория

Параметры процедуры позволяют передавать данные в процедуру и получать результат обратно.

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.