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

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 →