← Назад к вопросам
Что такое хранимые процедуры и чем они отличаются от функций?
1.8 Middle🔥 131 комментариев
#SQL и базы данных
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Хранимые процедуры и функции в базах данных
Хранимая процедура — это предкомпилированный набор SQL-инструкций и программной логики, хранящийся на сервере БД и выполняемый по вызову. Это один из ключевых инструментов оптимизации работы с данными и повышения производительности приложения.
Основные характеристики хранимых процедур
Хранимые процедуры содержат:
- SQL-инструкции (SELECT, INSERT, UPDATE, DELETE)
- Управляющие конструкции (IF/ELSE, циклы, обработка ошибок)
- Объявление переменных и параметров
- Транзакционную логику
Преимущества:
- Выполняются на стороне сервера БД (меньше сетевого трафика)
- Предкомпилированы (нет накладных расходов на парсинг)
- Переиспользование кода между приложениями
- Встроенная обработка ошибок и валидация
- Улучшенная безопасность (контроль доступа)
Пример процедуры в PostgreSQL:
CREATE PROCEDURE transfer_money(sender_id INT, receiver_id INT, amount DECIMAL)
LANGUAGE plpgsql
AS $$
BEGIN
UPDATE accounts SET balance = balance - amount WHERE id = sender_id;
UPDATE accounts SET balance = balance + amount WHERE id = receiver_id;
COMMIT;
EXCEPTION WHEN OTHERS THEN
ROLLBACK;
RAISE EXCEPTION 'Transfer failed: %', SQLERRM;
END;
$$;
CALL transfer_money(1, 2, 100);
Отличия от функций
| Аспект | Хранимая процедура | Функция |
|---|---|---|
| Возвращаемое значение | Может не возвращать ничего (void) или возвращать множество значений | Обязательно возвращает одно значение |
| Использование в SELECT | Вызывается через CALL | Может использоваться в SELECT, WHERE, JOIN |
| Параметры | IN (входные), OUT (выходные), INOUT | Только входные параметры |
| Побочные эффекты | Может изменять данные (транзакции) | Обычно недопустимы в функциях (STRICT) |
| Контроль транзакций | COMMIT/ROLLBACK внутри процедуры | Нельзя управлять транзакциями |
| Производительность | Для сложных операций над данными | Для вычислений и трансформаций |
Пример функции в PostgreSQL
CREATE FUNCTION calculate_bonus(salary DECIMAL, years_of_service INT)
RETURNS DECIMAL
LANGUAGE plpgsql
AS $$
DECLARE
bonus_percent DECIMAL;
BEGIN
IF years_of_service >= 10 THEN
bonus_percent := 0.20;
ELSIF years_of_service >= 5 THEN
bonus_percent := 0.10;
ELSE
bonus_percent := 0.05;
END IF;
RETURN salary * bonus_percent;
END;
$$;
SELECT id, salary, calculate_bonus(salary, years_of_service) AS bonus
FROM employees;
Когда использовать процедуры
- Сложные многошаговые операции — обновление связанных таблиц
- Требуется контроль транзакций — откатывание при ошибках
- Операции с множественными результатами — несколько OUT параметров
- Интенсивные вычисления на БД — уменьшение передачи данных
Когда использовать функции
- Вычисления и трансформации — расчёты, строковые операции
- Использование в запросах — фильтрация и проекция данных
- Переиспользование формул — бизнес-логика вычислений
- Чистота функций — определённый результат без побочных эффектов
Выбор между процедурой и функцией зависит от контекста: если нужна сложная логика с изменением состояния БД — процедура, если требуется вычисление результата для использования в запросе — функция.