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

✅ Решения

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

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

Хранимая процедура — сохранённый в базе блок SQL-кода для многократного выполнения.

В MySQL процедура создаётся через CREATE PROCEDURE, тело пишется в BEGIN ... END, а вызывается через CALL.

Параметры могут быть входными IN, выходными OUT и двунаправленными INOUT.

Минимальный пример: CALL add_employee('John Doe', 30); добавляет сотрудника через заранее созданную процедуру.

Процедуры подходят для повторяемых серверных процессов, сложной бизнес-логики и ограничения прямого доступа к таблицам.

Топ-3 ошибки: забыть DELIMITER, вызвать процедуру как функцию через SELECT, перепутать имя столбца id/employee_id в практической задаче.

Решение практической работы

DELIMITER //

CREATE PROCEDURE higher_than_avg(
    IN employee_in INT,
    OUT is_higher INTEGER
)
BEGIN
    DECLARE avg_salary DECIMAL(8,2);
    DECLARE employee_salary DECIMAL(8,2);

    SET avg_salary = (
        SELECT AVG(salary)
        FROM employees
    );

    SET employee_salary = (
        SELECT salary
        FROM employees
        WHERE id = employee_in
    );

    IF employee_salary > avg_salary THEN
        SET is_higher = 1;
    ELSE
        SET is_higher = 0;
    END IF;
END //

DELIMITER ;

CALL higher_than_avg(1, @is_higher);
SELECT @is_higher;

Решение использует две локальные переменные: среднюю зарплату по таблице и зарплату конкретного сотрудника. Затем IF записывает результат в выходной параметр.

В тексте источника практики параметр назван employee_id, а подготовительная таблица использует столбец id. В решении выше условие написано как WHERE id = employee_in. Если в вашей таблице столбец называется employee_id, замените имя в условии.