← Назад к вопросам

Что такое хранимые процедуры и чем они отличаются от функций?

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;

Когда использовать процедуры

  1. Сложные многошаговые операции — обновление связанных таблиц
  2. Требуется контроль транзакций — откатывание при ошибках
  3. Операции с множественными результатами — несколько OUT параметров
  4. Интенсивные вычисления на БД — уменьшение передачи данных

Когда использовать функции

  1. Вычисления и трансформации — расчёты, строковые операции
  2. Использование в запросах — фильтрация и проекция данных
  3. Переиспользование формул — бизнес-логика вычислений
  4. Чистота функций — определённый результат без побочных эффектов

Выбор между процедурой и функцией зависит от контекста: если нужна сложная логика с изменением состояния БД — процедура, если требуется вычисление результата для использования в запросе — функция.

Что такое хранимые процедуры и чем они отличаются от функций? | PrepBro