ISO/IEC 9075-4:1996
ISO/IEC 9075-4:1996 — это часть международного стандарта ISO/IEC 9075 «Язык SQL», определяющая SQL/PSM (Structured Query Language / Persistent Stored Modules). Стандарт описывает синтаксис и семантику языка для создания и использования хранимых процедур, функций, триггеров и модулей в реляционных базах данных. Он был принят в 1996 году как четвёртая часть серии стандартов SQL, дополнившая базовые возможности языка (SQL-92) средствами для написания серверного кода, выполняемого непосредственно в СУБД.
История
Разработка SQL/PSM началась в конце 1980-х годов, когда ведущие производители СУБД (Oracle, IBM, Sybase) начали внедрять проприетарные процедурные расширения SQL (например, PL/SQL в Oracle и Transact-SQL в Sybase и Microsoft SQL Server). Отсутствие единого стандарта приводило к несовместимости решений и затрудняло переносимость приложений между разными СУБД.
В 1992 году был принят стандарт SQL-92 (ISO/IEC 9075:1992), который заложил основы реляционной модели, но не включал средства для хранимых процедур. Работа над расширением началась сразу после его утверждения. Первая версия SQL/PSM была опубликована в 1996 году как часть ISO/IEC 9075-4:1996. Впоследствии стандарт неоднократно пересматривался: в 1999 году (SQL:1999), 2003 году (SQL:2003), 2008 году (SQL:2008), 2011 году (SQL:2011) и 2016 году (SQL:2016), причём каждая новая версия уточняла и расширяла возможности PSM.
Структура и основные компоненты
Стандарт ISO/IEC 9075-4:1996 определяет несколько ключевых конструкций, которые позволяют программировать логику обработки данных на стороне сервера базы данных.
Хранимые процедуры (Stored Procedures)
Хранимая процедура — это именованный блок кода, который может принимать входные параметры, выполнять последовательность операторов SQL и возвращать результат (в виде выходных параметров или результирующих наборов). Процедуры создаются с помощью оператора CREATE PROCEDURE и могут быть вызваны из приложения или другой процедуры. Пример синтаксиса по стандарту:
``sql CREATE PROCEDURE GetEmployeeCount (IN dept_id INTEGER, OUT emp_count INTEGER) BEGIN SELECT COUNT(*) INTO emp_count FROM employees WHERE department_id = dept_id; END; ``
Функции (Functions)
Функция отличается от процедуры тем, что обязательно возвращает скалярное значение (или таблицу) и может использоваться в выражениях SQL. Стандарт определяет два типа функций: скалярные (возвращающие одно значение) и табличные (возвращающие набор строк). Функции создаются с помощью CREATE FUNCTION. Пример:
``sql CREATE FUNCTION GetFullName (emp_id INTEGER) RETURNS VARCHAR(100) BEGIN DECLARE full_name VARCHAR(100); SELECT CONCAT(first_name, ' ', last_name) INTO full_name FROM employees WHERE id = emp_id; RETURN full_name; END; ``
Модули (Modules)
Модуль — это логическая единица группировки, которая может содержать несколько процедур и функций, а также общие объявления переменных и курсоров. Модули позволяют организовать код в библиотеки, аналогично пакетам в Oracle или схемам в других СУБД. В стандарте модуль определяется как отдельный объект схемы, но на практике многие СУБД реализуют модули через схемы или пакеты.
Триггеры (Triggers)
Триггер — это хранимая процедура, которая автоматически выполняется при наступлении определённого события (вставка, обновление, удаление строки) в таблице. Стандарт ISO/IEC 9075-4:1996 ввёл базовую поддержку триггеров, включая возможность указания времени выполнения (BEFORE, AFTER) и уровня срабатывания (FOR EACH ROW или FOR EACH STATEMENT). Пример:
``sql CREATE TRIGGER UpdateAudit AFTER INSERT ON employees FOR EACH ROW BEGIN INSERT INTO audit_log (table_name, action, timestamp) VALUES ('employees', 'INSERT', CURRENT_TIMESTAMP); END; ``
Управляющие конструкции
Стандарт включает в себя полный набор процедурных конструкций, характерных для языков программирования общего назначения:
- Условные операторы:
IF ... THEN ... ELSE ... END IF; - Циклы:
LOOP,WHILE,FOR(с курсорами) - Операторы ветвления:
CASE - Обработка исключений: блоки
BEGIN ... EXCEPTION ... END; - Объявление переменных:
DECLAREс указанием типов данных - Курсоры: для построчного обхода результирующих наборов
Отличия от проприетарных реализаций
Стандарт SQL/PSM был разработан как общий знаменатель для различных процедурных расширений SQL. Однако на практике ведущие СУБД реализовали его с существенными отклонениями:
- Oracle использует PL/SQL, который включает пакеты, исключения, коллекции и другие возможности, выходящие за рамки PSM. PL/SQL не полностью соответствует синтаксису PSM (например, использует
ISвместоAS,BEGIN ... ENDбез точки с запятой послеEND). - Microsoft SQL Server использует Transact-SQL (T-SQL), который имеет собственный синтаксис для переменных (
DECLARE @var), обработки ошибок (TRY...CATCH) и работы с курсорами. T-SQL частично поддерживает PSM, но не полностью. - PostgreSQL реализует PSM через язык PL/pgSQL (созданный по образцу Oracle PL/SQL), который в значительной степени соответствует стандарту, но добавляет собственные расширения (например,
RETURN QUERY,PERFORM). - MySQL поддерживает хранимые процедуры и функции, синтаксис которых близок к PSM, но с рядом отличий (например, использование
DELIMITERдля разделения операторов, отсутствие модулей).
Критика и ограничения
Стандарт ISO/IEC 9075-4:1996 подвергался критике за излишнюю сложность синтаксиса и недостаточную гибкость по сравнению с проприетарными решениями. Основные замечания:
- Отсутствие поддержки пакетов — в отличие от PL/SQL, стандарт не предусматривает группировку процедур и функций в пакеты с общим состоянием.
- Ограниченная обработка исключений — ранняя версия PSM не включала механизм пользовательских исключений и обработчиков, что усложняло написание надёжного кода.
- Несовместимость с существующими реализациями — многие СУБД уже имели свои процедурные языки, и переход на стандарт требовал значительных изменений, что сдерживало его принятие.
- Сложность синтаксиса — некоторые конструкции (например, работа с курсорами через
DECLARE CURSOR,OPEN,FETCH,CLOSE) были громоздкими по сравнению с более современными подходами.
Влияние и наследие
Несмотря на ограниченное прямое применение, стандарт SQL/PSM оказал значительное влияние на развитие процедурных расширений SQL. Он заложил основу для унификации синтаксиса и семантики хранимых процедур, что впоследствии было учтено в более поздних версиях стандарта (SQL:1999, SQL:2003). Многие СУБД, включая PostgreSQL и IBM Db2, реализовали поддержку PSM, что способствовало переносимости кода между разными системами.
В настоящее время (2025 год) стандарт ISO/IEC 9075-4:1996 устарел и заменён более новыми версиями (SQL:2016, SQL:2023). Однако его основные концепции — хранимые процедуры, функции, триггеры и модули — остаются фундаментом для разработки серверной логики в реляционных базах данных.
Источники
- ISO/IEC 9075-4:1996 «Information technology — Database languages — SQL — Part 4: Persistent Stored Modules (SQL/PSM)»
- ISO/IEC 9075:1992 «Information technology — Database languages — SQL»
- ISO/IEC 9075:1999 «Information technology — Database languages — SQL — Part 4: Persistent Stored Modules (SQL/PSM)»
- C. J. Date, «An Introduction to Database Systems», 8th Edition, 2003
- К. Дж. Дейт, «Введение в системы баз данных», 8-е издание, 2005
- Документация PostgreSQL: «PL/pgSQL — SQL Procedural Language»
- Документация Oracle: «PL/SQL Language Reference»
- Документация Microsoft SQL Server: «Transact-SQL Reference»
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →