ISO/IEC 9075-3
ISO/IEC 9075-3 — это часть международного стандарта ISO/IEC 9075 «Язык SQL», определяющая встроенный SQL (SQL/PSM — Persistent Stored Modules). Данная часть стандарта регламентирует синтаксис и семантику для написания хранимых процедур, функций, триггеров и других модулей, которые выполняются непосредственно в системе управления базами данных (СУБД). Стандарт является одним из ключевых компонентов SQL:1999 и последующих версий, обеспечивая переносимость серверного кода между различными СУБД.
История
Разработка стандарта ISO/IEC 9075-3 началась в 1990-х годах как часть общего расширения SQL. До этого SQL был преимущественно языком запросов и манипуляции данными (DML), а логика обработки данных реализовывалась на стороне клиента. Первая версия стандарта была опубликована в 1999 году как часть SQL:1999 (ISO/IEC 9075:1999). Основной целью было введение в SQL процедурных возможностей, таких как условные операторы, циклы, обработка исключений и поддержка локальных переменных, что позволяло создавать сложные бизнес-логики непосредственно в СУБД.
В последующих редакциях (SQL:2003, SQL:2008, SQL:2011, SQL:2016, SQL:2023) раздел SQL/PSM подвергался уточнениям и расширениям. В частности, были добавлены поддержка массивов, курсоров, рекурсивных вызовов, а также улучшена интеграция с типами данных, определёнными в других частях стандарта (например, с типами данных для работы с XML и JSON). Название «Persistent Stored Modules» (PSM) отражает ключевую особенность: код хранится в базе данных и может быть вызван повторно, что отличает его от временных скриптов, передаваемых в запросе.
Структура и содержание стандарта
ISO/IEC 9075-3 состоит из нескольких основных разделов, описывающих синтаксис и семантику процедурных расширений SQL.
Основные элементы
Стандарт определяет следующие конструкции:
- Хранимые процедуры (Stored Procedures) — именованные блоки кода, которые могут принимать входные параметры и возвращать выходные значения. Они выполняются в контексте базы данных и могут изменять её состояние.
- Функции (Functions) — именованные блоки, возвращающие скалярное значение или таблицу. В отличие от процедур, функции могут использоваться в выражениях SQL (например, в
SELECT). - Триггеры (Triggers) — специальные хранимые модули, которые автоматически выполняются при наступлении определённого события (например,
INSERT,UPDATE,DELETEна таблице). Стандарт определяет как простые триггеры, так и триггеры с возможностью доступа к старым и новым значениям строк (OLD ROW,NEW ROW). - Локальные переменные — переменные, объявленные внутри блока кода, с областью видимости, ограниченной этим блоком.
- Управляющие конструкции — операторы
IF,CASE,LOOP,WHILE,REPEAT,FOR, а такжеLEAVEиITERATEдля управления циклами. - Обработка исключений — блоки
DECLARE ... HANDLERдля обработки ошибок и предупреждений, возникающих во время выполнения. - Курсоры — механизм для построчной обработки результатов запроса. Стандарт определяет операции объявления, открытия, выборки и закрытия курсора, а также возможность использования курсоров в циклах.
Синтаксис
Стандарт использует синтаксис, близкий к языку программирования Ada или PL/SQL. Пример объявления хранимой процедуры:
``sql CREATE PROCEDURE update_salary (IN emp_id INTEGER, IN new_salary DECIMAL(10,2)) LANGUAGE SQL BEGIN UPDATE employees SET salary = new_salary WHERE id = emp_id; IF SQLSTATE = '00000' THEN COMMIT; ELSE ROLLBACK; END IF; END; ``
Классификация и связь с другими частями стандарта
ISO/IEC 9075-3 является частью многокомпонентного стандарта SQL. Основные связанные части:
- ISO/IEC 9075-1 (SQL/Framework) — общая архитектура и терминология.
- ISO/IEC 9075-2 (SQL/Foundation) — базовый язык SQL, включая DDL, DML, типы данных.
- ISO/IEC 9075-4 (SQL/PSM — Persistent Stored Modules) — фактически дублирующее название, но в некоторых редакциях стандарта этот номер закреплён за разделом, описывающим модули. На практике ISO/IEC 9075-3 и ISO/IEC 9075-4 часто рассматриваются как синонимы, хотя в разных версиях стандарта нумерация может незначительно различаться.
- ISO/IEC 9075-5 (SQL/Bindings) — описание интерфейсов для встраивания SQL в другие языки (например, C, Java).
- ISO/IEC 9075-14 (SQL/XML) — расширения для работы с XML.
- ISO/IEC 9075-15 (SQL/MDA) — расширения для многомерных массивов.
Стандарт SQL/PSM не является обязательным для реализации в СУБД, но его поддержка обеспечивает переносимость хранимого кода между системами, которые его реализуют.
Реализации в СУБД
Несмотря на наличие международного стандарта, большинство крупных СУБД имеют собственные диалекты процедурных языков, которые лишь частично соответствуют ISO/IEC 9075-3. Основные отличия касаются синтаксиса, типов данных, обработки ошибок и возможностей.
Примеры соответствия
- IBM Db2 — реализует SQL/PSM в значительной степени, включая поддержку хранимых процедур, функций и триггеров. Синтаксис близок к стандарту.
- MySQL — поддерживает хранимые процедуры и функции, но их синтаксис (PL/SQL-подобный) не полностью соответствует стандарту. Например, в MySQL используется
DELIMITERдля разделения операторов, а также имеются собственные расширения (например,DECLARE ... CONTINUE HANDLER). - PostgreSQL — использует собственный язык PL/pgSQL, который заимствует многие элементы из SQL/PSM, но не является его точной реализацией. В PostgreSQL также поддерживается написание хранимых процедур на других языках (PL/Python, PL/Perl и др.).
- Oracle Database — использует язык PL/SQL, который имеет много общего с SQL/PSM, но отличается в деталях (например, синтаксис объявления переменных, обработка исключений через
EXCEPTION). - Microsoft SQL Server — использует язык Transact-SQL (T-SQL), который также имеет процедурные расширения, но они существенно отличаются от стандарта (например, использование
BEGIN...END,WHILE,TRY...CATCH).
Степень совместимости
На практике полная совместимость с ISO/IEC 9075-3 встречается редко. Разработчики часто вынуждены адаптировать код под конкретную СУБД. Однако стандарт служит ориентиром для создания переносимых решений, особенно при использовании промежуточного программного обеспечения (например, ORM-систем), которое генерирует SQL-запросы и хранимые процедуры.
Применение
ISO/IEC 9075-3 находит применение в следующих областях:
- Разработка бизнес-логики на стороне сервера — хранимые процедуры и функции позволяют инкапсулировать сложные операции (например, расчёт зарплаты, проверка целостности данных) в базе данных, что снижает нагрузку на клиентские приложения и уменьшает сетевой трафик.
- Автоматизация задач с помощью триггеров — триггеры используются для аудита изменений, синхронизации данных, поддержания ссылочной целостности на уровне приложения.
- Создание API для доступа к данным — хранимые процедуры могут выступать в роли контролируемого интерфейса для клиентских приложений, скрывая внутреннюю структуру базы данных.
- Миграция данных и ETL-процессы — процедурные расширения SQL позволяют реализовывать сложные сценарии преобразования данных без использования внешних инструментов.
Критика и ограничения
Несмотря на широкое распространение, SQL/PSM и его реализации подвергаются критике по нескольким причинам:
- Сложность отладки — хранимые процедуры и функции часто сложнее отлаживать, чем код на языках общего назначения, из-за ограниченных инструментов профилирования и логирования.
- Проблемы с версионированием — управление версиями хранимого кода в базе данных может быть затруднено, особенно при работе в команде.
- Различия в диалектах — как уже упоминалось, отсутствие полной стандартизации приводит к проблемам переносимости кода между СУБД.
- Производительность — в некоторых случаях выполнение хранимых процедур может быть менее эффективным, чем выполнение аналогичного кода на стороне клиента, особенно при большом количестве сетевых вызовов.
Интересные факты
- Термин «Persistent Stored Modules» (PSM) был введён в стандарте SQL:1999, чтобы подчеркнуть, что код хранится в базе данных и может быть повторно использован.
- В некоторых СУБД (например, в PostgreSQL) поддержка хранимых процедур была добавлена только в версии 11 (2018 год), хотя функции поддерживались с более ранних версий.
- Стандарт ISO/IEC 9075-3 является одним из наиболее часто изменяемых разделов SQL, так как процедурные расширения активно развиваются в ответ на потребности разработчиков.
Источники
- ISO/IEC 9075-3:2023 — Information technology — Database languages — SQL — Part 3: Persistent Stored Modules (SQL/PSM).
- ISO/IEC 9075-1:2023 — Information technology — Database languages — SQL — Part 1: Framework (SQL/Framework).
- Ч. Дж. Дейт. «Введение в системы баз данных», 8-е издание.
- Документация IBM Db2, PostgreSQL, MySQL, Oracle Database, Microsoft SQL Server.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →