Spec-Zone .ru
спецификации, руководства, описания, API
|
Сохраненная подпрограмма является или процедурой или функцией. Сохраненные подпрограммы создаются с CREATE
PROCEDURE
и CREATE
FUNCTION
операторы (см. Раздел
13.1.15,"CREATE PROCEDURE
и CREATE FUNCTION
Синтаксис"). Процедура вызывается, используя a CALL
оператор (см. Раздел 13.2.1,"CALL
Синтаксис"), и может только пасовать назад значения, используя
выходные переменные. Функция может быть вызвана изнутри оператора точно так же как любая другая функция (то
есть, взывая к имени функции), и может возвратить скалярное значение. Тело сохраненной подпрограммы может
использовать составные операторы (см. Раздел 13.6, "MySQL
Compound-Statement Syntax").
Сохраненные подпрограммы могут быть отброшены с DROP PROCEDURE
и DROP
FUNCTION
операторы (см. Раздел 13.1.26,"DROP PROCEDURE
и DROP FUNCTION
Синтаксис"), и
измененный с ALTER PROCEDURE
и ALTER FUNCTION
операторы (см. Раздел
13.1.5,"ALTER PROCEDURE
Синтаксис").
Хранимая процедура или функция связываются с определенной базой данных. У этого есть несколько импликаций:
Когда подпрограмма вызывается, неявное USE
выполняется (и отменяется, когда подпрограмма
завершается). db_name
USE
операторы в пределах сохраненных подпрограмм не разрешаются.
Можно квалифицировать стандартные имена с именем базы данных. Это может
использоваться, чтобы обратиться к подпрограмме, которая не находится в текущей базе данных. Например,
чтобы вызвать хранимую процедуру p
или функция f
это связывается с test
база данных, можно
сказать CALL test.p()
или test.f()
.
Когда база данных отбрасывается, все сохраненные подпрограммы, связанные с нею, отбрасываются также.
Сохраненные функции не могут быть рекурсивными.
Рекурсия в хранимых процедурах разрешается, но отключается по умолчанию. Чтобы включить рекурсии, установите max_sp_recursion_depth
системная переменная сервера к значению, больше чем нуль. Рекурсия хранимой процедуры увеличивает требование к
стековому пространству потока. Если Вы увеличиваете значение max_sp_recursion_depth
, может быть необходимо увеличить размер стека потока,
увеличивая значение thread_stack
при запуске сервера. См. Раздел 5.1.4, "Системные Переменные
Сервера", для получения дополнительной информации.
MySQL поддерживает очень полезное расширение, которое включает использованию регулярных SELECT
операторы (то есть, не используя курсоры или локальные переменные) в
хранимой процедуре. Набор результатов такого запроса просто отправляется непосредственно клиенту. Многократный
SELECT
операторы генерируют многократные наборы результатов, таким образом, клиент должен пользоваться клиентской
библиотекой MySQL, которая поддерживает многократные наборы результатов. Это означает, что клиент должен
пользоваться клиентской библиотекой от версии MySQL, по крайней мере, столь же недавнего как 4.1. Клиент должен
также определить CLIENT_MULTI_RESULTS
опция, когда это соединяется. Для программ C
это может быть сделано с mysql_real_connect()
C API-функция. См. Раздел
22.8.7.53,"mysql_real_connect()
", и Раздел
22.8.17, "Поддержка API C Многократного Выполнения Оператора".