Gymterview
middle

Что такое хранимая процедура?

Хранимая процедура — именованный набор 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), а функция — нет. Функция обязана возвращать значение, процедура — необязательно.

На собеседовании: объясните, что хранимая процедура компилируется один раз и выполняется на сервере, упомяните преимущества. Частая ошибка — путать хранимые процедуры и функции, не знать разницу в управлении транзакциями.