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

✅ Решения

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

⚡ Кратко: ✅ решения

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

IN используется для входных значений: процедура читает аргумент и строит по нему запрос.

OUT используется для результата: процедура записывает значение в переменную вызывающего кода через SELECT ... INTO или SET.

INOUT совмещает оба направления: начальное значение приходит в процедуру, изменённое значение возвращается наружу.

Для OUT и INOUT в MySQL обычно передают пользовательские переменные вида @salary.

Минимальный пример: CALL get_employee_salary(1, @salary); SELECT @salary;.

Топ-3 ошибки: вызвать процедуру без CALL, передать литерал вместо переменной в OUT, забыть присвоить значение выходному параметру внутри процедуры.

Решение 1: IN

DELIMITER $$

CREATE PROCEDURE get_product_name(IN product_id INT)
BEGIN
    SELECT product_name
    FROM products
    WHERE id = product_id;
END $$

DELIMITER ;

CALL get_product_name(1);

Параметр product_id входит в процедуру и используется только в условии фильтрации.

Решение 2: OUT

DELIMITER $$

CREATE PROCEDURE get_annual_salary(IN emp_id INT, OUT annual_salary INT)
BEGIN
    SELECT monthly_salary * 12
    INTO annual_salary
    FROM employees
    WHERE id = emp_id;
END $$

DELIMITER ;

SET @annual_salary = 0;
CALL get_annual_salary(2, @annual_salary);
SELECT @annual_salary;

annual_salary не приходит из вызывающего кода как бизнес-значение. Процедура сама присваивает ему результат.

Решение 3: 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;

Если результат 1150.00, процедура получила начальное значение и вернула изменённое значение обратно в @bonus.