Открыть сервис

Хранимая процедура

Хранимая процедура — это объект базы данных, представляющий собой набор SQL-инструкций и управляющих конструкций, который компилируется и сохраняется на сервере базы данных под уникальным именем. Хранимые процедуры предназначены для инкапсуляции повторяющихся или сложных операций с данными, что позволяет выполнять их одним вызовом, передавая при необходимости входные параметры и получая выходные значения. Они являются ключевым элементом серверной логики в системах управления базами данных (СУБД).

История

Концепция хранимых процедур возникла в 1970-х годах вместе с развитием реляционных баз данных. Первые реализации появились в коммерческих СУБД, таких как Oracle (с языком PL/SQL) и Sybase (с языком Transact-SQL). В 1980-х годах Microsoft внедрила поддержку хранимых процедур в SQL Server, также используя Transact-SQL. В 1990-х годах стандарт SQL/PSM (Persistent Stored Modules) был принят ISO для унификации языков хранимых процедур. В настоящее время практически все современные СУБД (MySQL, PostgreSQL, IBM Db2, MariaDB) поддерживают хранимые процедуры, хотя синтаксис и возможности могут различаться.

Классификация

Хранимые процедуры классифицируются по нескольким признакам:

По типу возвращаемых данных

По способу вызова

По месту хранения

Устройство и синтаксис

Хранимая процедура состоит из заголовка и тела. Заголовок определяет имя, список параметров и атрибуты (например, язык, права доступа). Тело содержит SQL-инструкции и управляющие конструкции (условные операторы, циклы, обработка ошибок). Пример на языке Transact-SQL (Microsoft SQL Server):

```sql CREATE PROCEDURE GetEmployeeInfo @EmployeeID INT, @Name NVARCHAR(100) OUTPUT AS BEGIN SET NOCOUNT ON; SELECT @Name = FirstName + ' ' + LastName FROM Employees WHERE EmployeeID = @EmployeeID;

IF @@ROWCOUNT = 0 RAISERROR('Сотрудник не найден', 16, 1); END; ```

В PostgreSQL используется язык PL/pgSQL:

```sql CREATE OR REPLACE FUNCTION get_employee_info(emp_id INT, OUT emp_name TEXT) AS $$ BEGIN SELECT first_name || ' ' || last_name INTO emp_name FROM employees WHERE employee_id = emp_id;

IF NOT FOUND THEN RAISE EXCEPTION 'Сотрудник с ID % не найден', emp_id; END IF; END; $$ LANGUAGE plpgsql; ```

Параметры

Управляющие конструкции

Преимущества и недостатки

Преимущества

Недостатки

Применение

Хранимые процедуры широко используются в различных сферах:

Бизнес-логика

Администрирование баз данных

Интеграция с приложениями

Примеры

Процедура для вставки данных с проверкой

```sql CREATE PROCEDURE AddProduct @ProductName NVARCHAR(100), @Price DECIMAL(10,2), @CategoryID INT AS BEGIN IF NOT EXISTS (SELECT 1 FROM Categories WHERE CategoryID = @CategoryID) BEGIN RAISERROR('Категория не существует', 16, 1); RETURN; END

INSERT INTO Products (ProductName, Price, CategoryID) VALUES (@ProductName, @Price, @CategoryID); END; ```

Процедура для получения иерархии сотрудников (рекурсивная)

``sql CREATE PROCEDURE GetSubordinates @ManagerID INT AS BEGIN WITH EmployeeHierarchy AS ( SELECT EmployeeID, FirstName, LastName, ManagerID, 0 AS Level FROM Employees WHERE EmployeeID = @ManagerID UNION ALL SELECT e.EmployeeID, e.FirstName, e.LastName, e.ManagerID, eh.Level + 1 FROM Employees e INNER JOIN EmployeeHierarchy eh ON e.ManagerID = eh.EmployeeID ) SELECT * FROM EmployeeHierarchy; END; ``

Интересные факты

Критика

Некоторые разработчики и архитекторы программного обеспечения критикуют хранимые процедуры за то, что они привязывают бизнес-логику к конкретной СУБД, усложняя миграцию на другую платформу. Альтернативой является использование объектно-реляционного отображения (ORM), например, Entity Framework или Hibernate, которое позволяет переносить логику на уровень приложения. Однако сторонники хранимых процедур указывают на их производительность и безопасность, особенно в системах с высокой нагрузкой и строгими требованиями к целостности данных.

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →