Что такое хранимая процедура?
Хранимая процедура — именованный набор SQL-инструкций, который хранится и выполняется на сервере БД. Процедуры поддерживают входные и выходные параметры, локальные переменные, условные конструкции, циклы и могут выполнять как DDL, так и DML операции.
Аналогия из жизни: хранимая процедура — как рецепт блюда, записанный на кухне ресторана. Вместо того чтобы каждый раз описывать все шаги приготовления, официант просто говорит «сделай борщ» — и повар выполняет заранее известную последовательность действий.
Преимущества
- Производительность — при первом вызове процедура компилируется (синтаксический анализ + план выполнения), последующие вызовы выполняются быстрее
- Снижение сетевого трафика — вместо серии SQL-запросов клиент отправляет один вызов процедуры
- Переиспользование логики — одна процедура может вызываться из разных приложений
- Безопасность — можно дать пользователю право выполнять процедуру, но не прямой доступ к таблицам
Пример (PostgreSQL)
Пример хранимой процедуры
CREATE OR REPLACE PROCEDURE transfer_funds(
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;
-- Проверка баланса
IF (SELECT balance FROM accounts WHERE id = sender_id) < 0 THEN
RAISE EXCEPTION 'Insufficient funds';
END IF;
COMMIT;
END;
$$;
-- Вызов
CALL transfer_funds(1, 2, 1000.00);
Процедура vs Функция
В PostgreSQL процедуры (с CALL) и функции (с SELECT) — разные объекты. Процедура может управлять транзакциями (COMMIT/ROLLBACK), а функция — нет. Функция обязана возвращать значение, процедура — необязательно.
На собеседовании: объясните, что хранимая процедура компилируется один раз и выполняется на сервере, упомяните преимущества. Частая ошибка — путать хранимые процедуры и функции, не знать разницу в управлении транзакциями.