Хранимая процедура (Stored Procedure) — это предварительно скомпилированный набор SQL-операторов, хранящийся в базе данных и выполняемый как единое целое. Это именованный программный модуль, который может принимать параметры, выполнять сложные операции с данными и возвращать результаты.
Серверное выполнение
Выполняется на стороне СУБД, а не на клиенте
Предкомпиляция
Оптимизируется при создании, что повышает производительность
Повторное использование
Может вызываться многократно разными приложениями
Безопасность
Обеспечивает контроль доступа через права EXECUTE
Базовый синтаксис (варианты зависят от СУБД):
CREATE PROCEDURE procedure_name
[(@parameter1 datatype [= default_value] [OUTPUT], ...)]
AS
BEGIN
-- SQL-операторы
-- Логика процедуры
END;
CREATE PROCEDURE GetCustomerOrders
@CustomerID INT,
@StartDate DATE = NULL
AS
BEGIN
IF @StartDate IS NULL
SET @StartDate = DATEADD(month, -1, GETDATE())
SELECT o.OrderID, o.OrderDate, o.TotalAmount
FROM Orders o
WHERE o.CustomerID = @CustomerID
AND o.OrderDate >= @StartDate
ORDER BY o.OrderDate DESC;
END;
Производительность
Безопасность
Централизация логики
Сложная логика
Переносимость
Синтаксис различается между СУБД
Отладка
Сложнее отлаживать, чем код приложения
Версионирование
Требует дополнительных инструментов для контроля версий
CREATE PROCEDURE CalculateOrderStats
@OrderID INT,
@TotalItems INT OUTPUT,
@TotalAmount DECIMAL(18,2) OUTPUT
AS
BEGIN
SELECT @TotalItems = COUNT(*),
@TotalAmount = SUM(Quantity * UnitPrice)
FROM OrderDetails
WHERE OrderID = @OrderID;
END;
CREATE PROCEDURE TransferFunds
@FromAccount INT,
@ToAccount INT,
@Amount DECIMAL(18,2)
AS
BEGIN
BEGIN TRY
BEGIN TRANSACTION;
UPDATE Accounts SET Balance = Balance - @Amount
WHERE AccountID = @FromAccount;
UPDATE Accounts SET Balance = Balance + @Amount
WHERE AccountID = @ToAccount;
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
THROW;
END CATCH
END;
CREATE PROCEDURE SearchProducts
@SearchTerm VARCHAR(100),
@SortColumn VARCHAR(50) = 'ProductName'
AS
BEGIN
DECLARE @SQL NVARCHAR(MAX);
SET @SQL = N'SELECT ProductID, ProductName, Price
FROM Products
WHERE ProductName LIKE ''%' + @SearchTerm + '%''
ORDER BY ' + QUOTENAME(@SortColumn);
EXEC sp_executesql @SQL;
END;
Сложные бизнес-правила
Транзакции, валидации, многошаговые процессы
Пакетная обработка данных
Массовые обновления, ETL-операции
Критичные к производительности операции
Часто выполняемые сложные запросы
Системы с высокими требованиями безопасности
Где нужно строго контролировать доступ к данным
ORM и код приложения
Entity Framework, Hibernate и т.д.
Функции БД
Для более простых операций
Представления (Views)
Для инкапсуляции запросов без логики
Резюмируем: хранимые процедуры — это мощный инструмент в арсенале SQL-разработчика, который позволяет инкапсулировать сложную логику работы с данными на стороне сервера, повышая производительность, безопасность и поддерживаемость системы. Однако их следует использовать обдуманно, учитывая специфику проекта и архитектурные решения.