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

Ответ

Хранимая процедура (Stored Procedure) в SQL — это именованный набор SQL-инструкций, который хранится в базе данных как единый объект. Она предназначена для выполнения определенных действий или бизнес-логики на стороне сервера.

Основные особенности:

  • Инкапсуляция логики: Сложные операции можно скрыть за простым вызовом процедуры.
  • Производительность: План выполнения запросов внутри процедуры кэшируется, а также сокращается сетевой трафик между клиентом и сервером.
  • Безопасность: Можно выдавать права на выполнение процедуры, не давая прямого доступа к таблицам.
  • Повторное использование: Одну и ту же процедуру можно вызывать из разных частей приложения.

Отличие от функции (UDF - User-Defined Function)

Это ключевое различие, которое часто спрашивают на собеседованиях:

ХарактеристикаХранимая процедураФункция
Основная цельВыполнение набора действий (INSERT, UPDATE, DELETE)Вычисление и возврат одного значения
Возвращаемое значениеНе обязана возвращать значение (может возвращать через OUT-параметры)Обязана возвращать одно скалярное или табличное значение
Использование в SQLВызывается отдельно (CALL или EXEC)Может использоваться внутри SQL-запросов (SELECT, WHERE)
Изменение данныхМожет выполнять DML-операции (изменять данные в таблицах)Обычно не может (или не должна) изменять данные

Пример (PostgreSQL)

-- Процедура для перевода средств
CREATE OR REPLACE PROCEDURE transfer_funds(
    from_account INT,
    to_account INT,
    amount DECIMAL
)
LANGUAGE plpgsql
AS $
BEGIN
    -- Уменьшаем баланс на одном счете
    UPDATE accounts SET balance = balance - amount WHERE id = from_account;
    -- Увеличиваем баланс на другом
    UPDATE accounts SET balance = balance + amount WHERE id = to_account;

    -- Фиксируем транзакцию
    COMMIT;
END;
$;

-- Вызов процедуры
CALL transfer_funds(1, 2, 100.50);