27.2.1 Синтаксис хранимых процедур
Хранимая процедура — это либо процедура, либо функция. Хранимые процедуры создаются с помощью операторов CREATE
PROCEDURE и CREATE
FUNCTION (см. Раздел 15.1.18, «Операторы CREATE PROCEDURE и CREATE FUNCTION»). Процедура вызывается с помощью оператора CALL (см. Раздел 15.2.1, «Оператор CALL») и может возвращать значения только с помощью переменных вывода. Функцию можно вызвать изнутри оператора, как и любую другую функцию (то есть, вызвав имя функции), и она может возвращать скалярное значение. Тело хранимой процедуры может использовать составные операторы (см. Раздел 15.6, «Синтаксис составных операторов»).
Хранимые процедуры могут быть удалены с помощью операторов DROP
PROCEDURE и DROP
FUNCTION (см. Раздел 15.1.31, «Операторы 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 это можно сделать с помощью функции C API. См. , и .
Тип переменной пользователя, на которую ссылается оператор в хранимой процедуре, определяется при первом вызове процедуры и сохраняется при каждом последующем вызове.
© 2025 Oracle
Licensed under the GPLv2 License.