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