27.2.1 Синтаксис хранимых процедур
Хранимые процедуры — это либо процедуры, либо функции. Хранимые процедуры создаются с помощью операторов CREATE
PROCEDURE и CREATE
FUNCTION (см. Раздел 15.1.17, «Операторы CREATE PROCEDURE и CREATE FUNCTION»). Процедура вызывается с помощью оператора CALL (см. Раздел 15.2.1, «Оператор CALL») и может возвращать значения только с помощью выходных переменных. Функция может вызываться внутри оператора, как и любая другая функция (то есть, вызывая имя функции), и может возвращать скалярное значение. Тело хранимой процедуры может использовать составные операторы (см. Раздел 15.6, «Синтаксис составных операторов»).
Хранимые процедуры могут быть удалены с помощью операторов DROP
PROCEDURE и DROP
FUNCTION (см. Раздел 15.1.29, «Операторы DROP PROCEDURE и DROP FUNCTION»), и изменены с помощью операторов ALTER PROCEDURE и ALTER FUNCTION (см. Раздел 15.1.7, «Оператор ALTER PROCEDURE»).
Хранимая процедура или функция связана с определенной базой данных. Это имеет несколько последствий:
При вызове процедуры выполняется неявная
USE(и отменяется при завершении процедуры). Операторыdb_nameUSEвнутри хранимых процедур запрещены.Вы можете указывать имена процедур с именем базы данных. Это позволяет ссылаться на процедуру, которая не находится в текущей базе данных. Например, чтобы вызвать хранимую процедуру
pили функциюf, которая связана с базой данныхtest, можно использоватьCALL test.p()илиtest.f().При удалении базы данных также удаляются все хранимые процедуры, связанные с ней.
Хранимые функции не могут быть рекурсивными.
Рекурсия в хранимых процедурах разрешена, но по умолчанию отключена. Чтобы включить рекурсию, установите системную переменную сервера max_sp_recursion_depth на значение больше нуля. Рекурсия в хранимых процедурах увеличивает нагрузку на стек потоков. Если вы увеличите значение max_sp_recursion_depth, возможно, потребуется увеличить размер стека потоков, увеличив значение thread_stack при запуске сервера. Подробнее см. в Разделе 7.1.8, «Системные переменные сервера».
MySQL поддерживает очень полезное расширение, которое позволяет использовать обычные операторы SELECT (то есть без использования курсоров или локальных переменных) внутри хранимой процедуры. Результат такого запроса просто отправляется напрямую клиенту. Несколько операторов SELECT генерируют несколько наборов результатов, поэтому клиент должен использовать библиотеку клиента MySQL, которая поддерживает несколько наборов результатов. Это означает, что клиент должен использовать библиотеку клиента от версии MySQL не менее чем 4.1. Клиент также должен указать опцию CLIENT_MULTI_RESULTS при подключении. Для программ на языке C это можно сделать с помощью функции API C. См. , и .
Тип переменной пользователя, на которую ссылается оператор в хранимой процедуре, определяется при первом вызове процедуры и сохраняется при каждом последующем вызове.
© 2025 Oracle
Licensed under the GPLv2 License.