Введение

Подпрограмма, доступная приложениям, обращающимся к реляционным системам управления базами данных.
Хранимая процедура (также называемая prc, proc, storp, sproc, StoPro, StoredProc, StoreProc, sp или SP) — это подпрограмма, доступная приложениям, обращающимся к реляционной системе управления базами данных (RDBMS). Такие процедуры хранятся в словаре данных базы данных. Области применения хранимых процедур включают проверку данных (интегрированную в базу данных) или механизмы контроля доступа. Кроме того, хранимые процедуры могут объединять и централизовать логику, первоначально реализованную в приложениях. Для экономии времени и памяти, ресурсоемкая или сложная обработка, требующая выполнения нескольких SQL-запросов, может быть сохранена в хранимых процедурах, и все приложения вызывают эти процедуры. Можно использовать вложенные хранимые процедуры, выполняя одну хранимую процедуру внутри другой. Хранимые процедуры могут возвращать результирующие наборы, то есть результаты оператора SELECT. Эти результирующие наборы могут обрабатываться с помощью курсоров, другими хранимыми процедурами, путем связывания локатора результирующего набора или приложениями. Хранимые процедуры также могут содержать объявленные переменные для обработки данных и курсоры, позволяющие им перебирать несколько строк в таблице. Операторы управления потоком хранимых процедур обычно включают операторы IF, WHILE, LOOP, REPEAT и CASE, и другие. Хранимые процедуры могут принимать переменные, возвращать результаты или изменять переменные и возвращать их, в зависимости от того, как и где переменная объявлена.

Сравнение со статическим SQL

Поскольку инструкции хранимых процедур хранятся непосредственно в базе данных, они могут устранить часть или всю накладных расходов на компиляцию, обычно возникающих при отправке встроенных (динамических) SQL-запросов из программных приложений в базу данных. (Однако большинство систем управления базами данных реализуют кэширование инструкций и другие методы для предотвращения повторной компиляции динамических SQL-инструкций.) Кроме того, хотя они и позволяют избежать некоторой предварительной компиляции SQL, инструкции усложняют создание оптимального плана выполнения, поскольку не все аргументы SQL-инструкции доступны во время компиляции. В зависимости от конкретной реализации и конфигурации базы данных, производительность хранимых процедур по сравнению с обычными запросами или пользовательскими функциями может быть различной. Сокращение сетевого трафика Одним из основных преимуществ хранимых процедур является возможность их выполнения непосредственно в ядре базы данных. В производственной среде это обычно означает, что процедуры выполняются полностью на специализированном сервере базы данных с прямым доступом к данным. Это позволяет снизить сетевые затраты, что особенно заметно при выполнении серии SQL-инструкций. Инкапсуляция бизнес-логики Хранимые процедуры позволяют программистам внедрять бизнес-логику в базу данных в виде API, что упрощает управление данными и снижает необходимость кодирования этой логики в клиентских программах. Это может уменьшить вероятность повреждения данных из-за ошибок в клиентских программах. Система управления базами данных может обеспечить целостность и согласованность данных с помощью хранимых процедур. Делегирование прав доступа Во многих системах хранимым процедурам можно предоставить права доступа к базе данных, которых нет у пользователей, выполняющих эти процедуры. Частичная защита от SQL-инъекций Хранимые процедуры можно использовать для защиты от атак типа SQL-инъекция. Параметры хранимых процедур будут рассматриваться как данные, даже если злоумышленник попытается внедрить SQL-команды. Кроме того, некоторые СУБД проверяют тип параметра. Однако хранимая процедура, которая, в свою очередь, генерирует динамический SQL на основе входных данных, все равно уязвима для SQL-инъекций, если не приняты соответствующие меры предосторожности.

Другие применения

В некоторых системах хранимые процедуры могут использоваться для управления транзакциями, а в других они выполняются внутри транзакции, что делает транзакции для них практически невидимыми. Хранимые процедуры также могут вызываться из триггера базы данных или обработчика условий. Например, хранимая процедура может быть активирована вставкой данных в определенную таблицу или обновлением определенного поля в таблице, после чего код внутри процедуры будет выполнен. Использование хранимых процедур в качестве обработчиков условий также позволяет администраторам баз данных более детально отслеживать ошибки в системе, перехватывая их с помощью хранимых процедур и записывая информацию об аудите в базу данных или внешний ресурс, например, файл.

Сравнение с функциями

Функция — это подпрограмма, написанная для выполнения определенных вычислений. Скалярная функция возвращает только одно значение (или NULL), а табличная функция возвращает (реляционную) таблицу, состоящую из нуля или более строк, каждая из которых содержит один или несколько столбцов. Функции должны возвращать значение (с помощью ключевого слова RETURN), но для хранимых процедур это не обязательно. Хранимые процедуры могут использовать ключевое слово RETURN, но без передачи значения. Функции могут использоваться в операторах SELECT, при условии, что они не производят манипуляций с данными. Однако процедуры нельзя включать в операторы SELECT. Хранимая процедура может возвращать несколько значений с помощью параметра OUT или не возвращать никаких значений. Хранимая процедура экономит время компиляции запросов. Хранимая процедура является объектом базы данных. Хранимая процедура является материализованным объектом.

Сравнение с подготовленными отчетами

Подготовленные выражения преобразуют обычный запрос или оператор, параметризуя его для последующего использования с различными литеральными значениями. Как и хранимые процедуры, они хранятся на сервере для повышения производительности и обеспечивают определенную защиту от SQL-инъекций. Несмотря на простоту и декларативность, подготовленные выражения обычно не предназначены для использования процедурной логики и не могут оперировать переменными. Благодаря простому интерфейсу и клиентским реализациям, подготовленные выражения более широко применимы между различными СУБД.

Сравнение с смарт-контрактами

Умный контракт – это термин, применяемый к исполняемому коду, хранящемуся на блокчейне, в отличие от реляционной базы данных (RDBMS). Несмотря на то, что механизмы достижения консенсуса в публичных блокчейн-сетях принципиально отличаются от традиционных частных или федеративных баз данных, они выполняют, по сути, ту же функцию, что и хранимые процедуры, хотя обычно связаны с передачей ценности.

Недостатки

Языки хранимых процедур часто зависят от конкретного поставщика. Смена поставщика базы данных обычно требует переписывания существующих хранимых процедур. Отслеживать изменения в хранимых процедурах в системе контроля версий сложнее, чем изменения в обычном коде. Эти изменения необходимо воспроизводить в виде скриптов для хранения в истории проекта, а различия между процедурами сложнее корректно объединять и отслеживать. Ошибки в хранимых процедурах нельзя обнаружить на этапе компиляции или сборки в IDE приложения, и то же самое верно, если хранимая процедура была потеряна или случайно удалена. Языки хранимых процедур от разных поставщиков обладают разным уровнем возможностей. Например, pgpsql от Postgres имеет больше языковых функций (особенно благодаря расширениям), чем T-SQL от Microsoft. Инструментальная поддержка для написания и отладки хранимых процедур часто уступает аналогичной поддержке для других языков программирования, хотя это зависит от поставщика и языка. Например, для PL/SQL и T-SQL существуют специализированные IDE и отладчики. PL/PgSQL можно отлаживать из различных IDE.