Хранимая процедура — объект базы данных, содержащий набор SQL-инструкций с поддержкой процедурной логики (переменные, условия IF/CASE, циклы LOOP/WHILE, обработка ошибок). Хранится и исполняется на сервере СУБД, что снижает сетевой трафик между приложением и БД.
Пример (MySQL)
DELIMITER //
CREATE PROCEDURE GetUserOrders(IN userId INT)
BEGIN
SELECT o.*, p.name
FROM orders o
JOIN products p ON o.product_id = p.id
WHERE o.user_id = userId
ORDER BY o.created_at DESC;
END //
DELIMITER ;
-- Вызов
CALL GetUserOrders(42);
Преимущества и недостатки
Преимущества: сокращение сетевых round-trip; план выполнения кешируется СУБД; бизнес-логика сосредоточена в одном месте; упрощение прав (доступ к процедуре, но не к таблицам).
Недостатки: логика в СУБД затрудняет тестирование и версионирование; миграция на другую СУБД требует переписывания (диалекты SQL различаются); отладка сложнее, чем в коде приложения.
История
Первые хранимые процедуры появились в Sybase SQL Server в 1984 году. Microsoft SQL Server унаследовал концепцию в 1989 году (Transact-SQL). Oracle PL/SQL появился в 1991 году. MySQL добавил хранимые процедуры в версии 5.0 (2005). PostgreSQL поддерживает PL/pgSQL с версии 7.3 (2002) и добавил нативный синтаксис PROCEDURE в 11.0 (2018).
Связь с хостингом
Хранимые процедуры доступны в MySQL 5.0+ и PostgreSQL на любом тарифе с полноценным доступом к СУБД. На виртуальном хостинге — через phpMyAdmin или SSH. На VDS — полный контроль. ORM-фреймворки (Doctrine, Eloquent) обычно не поддерживают хранимые процедуры нативно — вызов происходит через raw SQL.
Хранимые процедуры в практике хостинга
Хранимая процедура (stored procedure) -- блок SQL-кода, хранящийся на сервере БД и вызываемый по имени. Преимущества: снижение сетевого трафика (один вызов вместо 10 запросов), повторное использование логики, контроль доступа (пользователь может вызвать процедуру без права на таблицы). Недостатки: логика размазана между приложением и БД, сложная отладка и версионирование, привязка к конкретной СУБД.
Примеры использования
Типичные сценарии для хранимых процедур: финансовые транзакции (перевод средств в одной атомарной операции), batch-обработка данных (ETL), периодические задачи через EVENT SCHEDULER в MySQL. Пример MySQL: CREATE PROCEDURE transfer_funds(IN from_acc INT, IN to_acc INT, IN amount DECIMAL) BEGIN ... END. MySQL, PostgreSQL (PL/pgSQL), Oracle (PL/SQL) -- все поддерживают хранимые процедуры. PostgreSQL PL/pgSQL более функциональный и поддерживает returns типы таблиц. База данных выполняет процедуры на стороне сервера, что экономит Round Trip Time. JDBC вызывает хранимые процедуры через CallableStatement.
История хранимых процедур
Хранимые процедуры появились в Oracle в 1980-х годах. Sybase и Microsoft добавили Transact-SQL (T-SQL) в 1989--1992 годах. MySQL добавил хранимые процедуры в версии 5.0 (2005). PostgreSQL поддерживает PL/pgSQL с версии 6.4 (1998). Современная тенденция: бизнес-логику переносят в приложение (ORM, microservices), оставляя в процедурах только критические транзакции. Экспорт БД включает дамп хранимых процедур через mysqldump --routines.