SQL/PSM
SQL/PSM (SQL/Persistent Stored Modules) — это стандарт Международной организации по стандартизации (ISO) и Международной электротехнической комиссии (IEC), определяющий расширение языка SQL для написания хранимых модулей, включая процедуры, функции, триггеры и пакеты. Стандарт регламентирует синтаксис и семантику процедурного языка, который встраивается в SQL и позволяет реализовывать бизнес-логику непосредственно на стороне сервера баз данных. Первая версия стандарта была принята в 1996 году, а последующие уточнения вошли в состав стандартов SQL:1999, SQL:2003, SQL:2008, SQL:2011, SQL:2016 и SQL:2023.
История
До принятия стандарта SQL/PSM каждый крупный производитель систем управления базами данных (СУБД) разрабатывал собственные процедурные расширения. Наиболее заметными из них были PL/SQL компании Oracle (1989 год) и Transact-SQL (T-SQL) компаний Sybase и Microsoft (середина 1980-х годов). Отсутствие единого стандарта приводило к фрагментации знаний, сложностям с переносимостью кода между разными СУБД и привязке потребителей к одному поставщику.
Работа над стандартом началась в первой половине 1990-х годов под руководством технического комитета ISO/IEC JTC 1/SC 32 «Управление данными и обмен информацией». В 1996 году был опубликован международный стандарт ISO/IEC 9075-4:1996, который описывал язык управления потоками (условные операторы, циклы), объявление переменных, работу с курсорами и механизмы обработки исключений. Этот документ получил название SQL/PSM. В последующих версиях стандарта — начиная с SQL:1999 — раздел PSM был существенно расширен: были добавлены функции, триггеры, рекурсивные процедуры, команды для работы с большими объектами (LOB) и улучшена интеграция с реляционной моделью.
Классификация
Стандарт SQL/PSM подразделяется на несколько функциональных компонентов, каждый из которых описывает определённый тип хранимых модулей:
Хранимые процедуры
Хранимые процедуры представляют собой именованные наборы SQL-операторов, которые компилируются и сохраняются в базе данных. Они могут принимать входные (IN) и выходные (OUT) параметры, а также параметры двойного назначения (INOUT). Вызов процедуры осуществляется с помощью оператора CALL. В отличие от функций, процедуры не обязаны возвращать значение, но могут модифицировать данные.
Хранимые функции
Функции отличаются от процедур обязательным возвратом одного значения (скалярного типа или табличного) и строгими ограничениями на побочные эффекты при работе с данными. В стандарте выделяются скалярные функции (возвращают одно скалярное значение) и табличные функции (возвращают таблицу). Функции могут использоваться внутри SQL-выражений, например, в SELECT или WHERE.
Триггеры
Триггеры — это специальные хранимые модули, которые автоматически выполняются в ответ на определённые события, происходящие с таблицами или представлениями. В стандарте SQL/PSM поддерживаются триггеры времени BEFORE, AFTER и INSTEAD OF, а также уровни срабатывания: для каждой строки (FOR EACH ROW) и для оператора (FOR EACH STATEMENT). Триггеры позволяют реализовывать сложные бизнес-правила, аудит и каскадные изменения.
Пакеты
Пакеты (или модули) объединяют логически связанные процедуры, функции, переменные, курсоры и типы данных под общим именем. Пакеты имеют спецификацию (интерфейсную часть) и тело (реализацию). Стандарт SQL/PSM поддерживает концепцию пакетов с сокрытием реализации (инкапсуляцией) и возможностью хранения состояния в глобальных переменных уровня сессии.
Устройство и синтаксис
Основой языка SQL/PSM является блочная структура. Каждый блок (BEGIN ... END) может содержать объявления переменных, констант, локальных курсоров и обработчиков ошибок. Внутри блока допускаются любые операторы SQL, а также управляющие конструкции процедурного языка.
Переменные и типы данных
Переменные объявляются с указанием конкретного типа данных SQL, включая стандартные (INTEGER, VARCHAR, DECIMAL, DATE, TIMESTAMP), а также пользовательские типы. Объявление происходит до тела блока. Переменные могут инициализироваться при объявлении или получать значения через оператор присваивания SET или SELECT INTO.
Управляющие конструкции
- Условные операторы:
IF ... THEN ... ELSEIF ... ELSE ... END IF;иCASE. - Циклы:
LOOP,WHILE ... LOOP,FOR ... AS ... CURSOR ... LOOP,REPEAT ... UNTIL ... END REPEAT. Для циклов предусмотрены операторыLEAVE(досрочный выход) иITERATE(переход к следующей итерации). - Обработка исключений: блок
DECLARE ... CONDITIONдля объявления пользовательских условий,DECLARE ... HANDLERдля определения обработчика (CONTINUE,EXIT,UNDO). Стандарт описывает встроенные условияSQLSTATEдля диагностики.
Курсоры
Курсоры позволяют построчно обрабатывать результат запроса. Для работы с курсором используются операторы DECLARE ... CURSOR FOR ... (объявление), OPEN (открытие), FETCH ... INTO ... (извлечение строки), CLOSE (закрытие). Стандарт поддерживает как односторонние, так и прокручиваемые (SCROLL) курсоры.
Применение
Хранимые модули по стандарту SQL/PSM применяются для различных задач управления базами данных:
- Реализация бизнес-логики: Процедуры и триггеры позволяют централизовать правила, управляющие данными (например, проверка корректности вводимых значений, автоматическое выставление даты создания записи, контроль ссылочной целостности).
- Повышение производительности: Выполнение сложных запросов на стороне сервера снижает сетевой трафик и нагрузку на клиентские приложения, а компилируемый или интерпретируемый код процедур быстрее обрабатывается сервером, чем множество отдельных запросов.
- Обеспечение безопасности: Доступ к данным может быть предоставлен только через хранимые процедуры, которые скрывают внутреннюю структуру таблиц и позволяют контролировать права доступа на уровне операций.
- Аудит и журналирование: Триггеры автоматически фиксируют изменения в отдельных таблицах, создавая записи в журналах аудита.
- Пакетная обработка: Процедуры позволяют выполнять последовательности операций (например, ежемесячное начисление процентов по вкладам, генерация отчётов) без участия пользователя.
Поддержка в популярных СУБД
Несмотря на существование стандарта, многие СУБД реализуют собственные процедурные расширения, лишь частично совместимые со стандартом SQL/PSM. Основные реализации включают:
- PL/SQL (Oracle, MySQL, MariaDB): Наиболее близок к стандарту, хотя базируется на языке Ada, а не на оригинальном стандарте SQL/PSM. PL/SQL имеет развитые пакеты, поддержку коллекций и расширенную обработку исключений.
- Transact-SQL (Microsoft SQL Server, Sybase ASE): Существенно отличается синтаксисом (нет блоков
BEGIN/ENDдля всех конструкций, другой способ объявления переменных, отсутствие пакетов). Microsoft SQL Server не полностью поддерживает стандарт SQL/PSM. - PL/pgSQL (PostgreSQL): Ориентируется на стандарт SQL/PSM, но имеет свои особенности (например, использование
$$...$$для строковых литералов, расширенная работа с массивами и пользовательскими типами). - PSM для IBM Db2: Реализация близка к оригинальному стандарту SQL/PSM, создавалась с учётом проекта стандарта.
- Иные реализации: Sybase SQL Anywhere, SAP HANA, MariaDB (аппаратный слой
SQL/PSM), InterBase/Firebird (языки процедурных расширений).
Интересные факты
- Стандарт ISO/IEC 9075-4:1996, описывающий PSM, стал первым международным стандартом, регламентирующим процедурные расширения языка SQL. До его принятия отсутствовала возможность переносимого кода.
- Термин «PSM» часто путают с «SQL/PSM». Фактически PSM — это полное название части стандарта, а «SQL/PSM» является распространённым сокращением.
- Разработчики PostgreSQL и Firebird сознательно минимизировали дивергенцию от стандарта SQL/PSM, чтобы облегчить переносимость кода из других СУБД. Это привело к появлению режима совместимости с плагином
PL/PSM. - В версии SQL:2016 в стандарт PSM была добавлена поддержка
JSON-операций иROW-типов, что отражает эволюцию языка SQL в сторону работы с полуструктурированными данными. - Сложность полной реализации стандарта обусловлена тем, что в нём детально описан не только синтаксис, но и семантика: например, правила видимости переменных в блоках, типы соединений курсоров и последовательность обработки триггеров. Большинство коммерческих СУБД реализуют подмножество стандарта, жертвуя некоторыми возможностями ради производительности или обратной совместимости.
Критика
Несмотря на стремление к унификации, стандарт SQL/PSM не стал доминирующим на практике. Основные причины:
- Фрагментация рынка: Каждый основной производитель СУБД имеет устоявшуюся базу пользователей, привыкших к собственному языку. Перенос кода на другую платформу часто требует значительных изменений из-за диалектных различий.
- Производительность: Реализация стандарта на уровне оптимизатора и бэкенда сложна. Коммерческие СУБД часто вводят собственные оптимизации (например, компиляция процедур в машинный код), которые не регламентированы стандартом.
- Ограниченная стандартизация: В стандарте не описаны многие востребованные возможности (динамические SQL-запросы с переменным числом параметров, поддержка вложенных коллекций как типов данных, работа с внешними ресурсами через расширения). Разработчикам приходится использовать фирменные расширения, снижая переносимость.
Источники
- ISO/IEC 9075-4:1996 «Information technology — Database languages — SQL — Part 4: Persistent Stored Modules (SQL/PSM)».
- ISO/IEC 9075-4:2023 «Information technology — Database languages — SQL — Part 4: Persistent Stored Modules (SQL/PSM)».
- Международный стандарт SQL:1999, спецификации ISO/IEC 9075.
- MySQL 8.0 Reference Manual: «SQL Syntax for Stored Programs».
- PostgreSQL Documentation: «PL/pgSQL — SQL Procedural Language».
- Oracle Database PL/SQL Language Reference, 19c.
- Microsoft SQL Server Documentation: Transact-SQL Reference (SQL Server 2022).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →