✅ Решения
⚡ Кратко: ✅ решения
Параметры процедуры позволяют передавать данные в процедуру и получать результат обратно.
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.