Ответ
Хранимая процедура (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);