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

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 →