Spec-Zone .ru
спецификации, руководства, описания, API

13.2.1. CALL Синтаксис

CALL sp_name([parameter[,...]])CALL sp_name[()]

CALL оператор вызывает хранимую процедуру, которая была определена ранее с CREATE PROCEDURE.

Хранимые процедуры, которые не берут параметров, могут быть вызваны без круглых скобок. Таким образом, CALL p() и CALL p эквивалентны.

CALL может пасовать назад значения к его вызывающей стороне, используя параметры, которые объявляются как OUT или INOUT параметры. Когда процедура возвращается, клиентская программа может также получить число строк, на которые влияют для заключительного оператора, выполняемого в пределах подпрограммы: На уровне SQL вызовите ROW_COUNT() функция; от API C вызовите mysql_affected_rows() функция.

Возвращать значение из процедуры, используя OUT или INOUT параметр, передайте параметр посредством пользовательской переменной, и затем проверьте значение переменной после возвратов процедуры. (Если Вы вызываете процедуру изнутри другой хранимой процедуры или функции, можно также передать стандартный параметр или локальную стандартную переменную как IN или INOUT параметр.) Для INOUT параметр, инициализируйте его значение прежде, чем передать это к процедуре. Следующая процедура имеет OUT параметры, которые процедура устанавливает к текущей версии сервера, и INOUT значение, которое процедура постепенно увеличивает одним от ее текущей стоимости:

CREATE PROCEDURE p (OUT ver_param VARCHAR(25), INOUT incr_param INT)BEGIN  # Set value of OUT parameter  SELECT VERSION() INTO ver_param;  # Increment value of INOUT parameter  SET incr_param = incr_param + 1;END;

Прежде, чем вызвать процедуру, инициализируйте переменную, которую передадут как INOUT параметр. После вызова процедуры значения этих двух переменных будут установлены или изменены:

mysql> SET @increment = 10;mysql> CALL p(@version, @increment);mysql> SELECT @version, @increment;+--------------+------------+| @version     | @increment |+--------------+------------+| 5.5.3-m3-log |         11 |+--------------+------------+

В готовом CALL операторы, используемые с PREPARE и EXECUTE, заполнители могут использоваться для IN параметры. Для OUT и INOUT параметры, поддержка заполнителя доступна с MySQL 5.5.3. Эти типы параметров могут использоваться следующим образом:

mysql> SET @increment = 10;mysql> PREPARE s FROM 'CALL p(?, ?)';mysql> EXECUTE s USING @version, @increment;mysql> SELECT @version, @increment;+--------------+------------+| @version     | @increment |+--------------+------------+| 5.5.3-m3-log |         11 |+--------------+------------+

Перед MySQL 5.5.3 поддержка заполнителя не доступна для OUT или INOUT параметры. Работать вокруг этого ограничения на OUT и INOUT параметры, предшествуйте использованию заполнителей; вместо этого, обратитесь к пользовательским переменным в CALL оператор непосредственно и не определяет их в EXECUTE оператор:

mysql> SET @increment = 10;mysql> PREPARE s FROM 'CALL p(@version, @increment)';mysql> EXECUTE s;mysql> SELECT @version,
        @increment;+--------------+------------+| @version     | @increment |+--------------+------------+| 5.5.0-m2-log |         11 |+--------------+------------+

Записать программы C, которые используют CALL SQL-оператор, чтобы выполнить хранимые процедуры, которые производят наборы результатов, CLIENT_MULTI_RESULTS флаг должен быть включен. Это то, потому что каждый CALL возвращает результат указать на состояние вызова, в дополнение к любым наборам результатов, которые могли бы быть возвращены операторами, выполняемыми в пределах процедуры. CLIENT_MULTI_RESULTS должен также быть включен если CALL используется, чтобы выполнить любую хранимую процедуру, которая содержит готовые операторы. Это не может быть определено, когда такая процедура загружается, произведут ли те операторы наборы результатов, таким образом, будет необходимо предположить, что они будут.

CLIENT_MULTI_RESULTS может быть включен, когда Вы вызываете mysql_real_connect(), любой явно, передавая CLIENT_MULTI_RESULTS флаг непосредственно, или неявно передавая CLIENT_MULTI_STATEMENTS (который также включает CLIENT_MULTI_RESULTS). В MySQL 5.6, CLIENT_MULTI_RESULTS включается по умолчанию.

Обработать результат a CALL оператор выполнил использование mysql_query() или mysql_real_query(), используйте цикл, который вызывает mysql_next_result() определить, есть ли больше результатов. Для примера см. Раздел 22.8.17, "Поддержка API C Многократного Выполнения Оператора".

Для программ, записанных на языке, который обеспечивает интерфейс MySQL, нет никакого собственного метода до MySQL 5.5.3 для того, чтобы непосредственно получить результаты OUT или INOUT параметры от CALL операторы. Чтобы получить значения параметра, передайте определяемые пользователем переменные к процедуре в CALL оператор и затем выполняет a SELECT оператор, чтобы произвести набор результатов, содержащий значения переменных. Обработать INOUT параметр, выполните оператор до CALL это устанавливает соответствующую пользовательскую переменную в значение, которое передадут к процедуре.

Следующий пример иллюстрирует метод (без проверки на ошибки) для хранимой процедуры p описанный ранее, который имеет OUT параметр и INOUT параметр:

mysql_query(mysql, "SET @increment = 10");mysql_query(mysql, "CALL p(@version, @increment)");mysql_query(mysql, "SELECT @version, @increment");result = mysql_store_result(mysql);row = mysql_fetch_row(result);mysql_free_result(result);

После того, как предыдущий код выполняется, row[0] и row[1] содержите значения @version и @increment, соответственно.

В MySQL 5.6, C программы может использовать интерфейс готового оператора, чтобы выполниться CALL операторы и доступ OUT и INOUT параметры. Это делается, обрабатывая результат a CALL оператор используя цикл, который вызывает mysql_stmt_next_result() определить, есть ли больше результатов. Для примера см. Раздел 22.8.20, "Поддержка API C Готового CALL Операторы". Языки, которые обеспечивают интерфейс MySQL, могут использовать подготовленный CALL операторы, чтобы непосредственно получить OUT и INOUT параметры процедуры.

С MySQL 5.6.6 метаданные изменяются на объекты, упомянутые сохраненными программами, обнаруживаются и вызывают автоматический перепарсинг операторов, на которые влияют, когда программа затем выполняется. Для получения дополнительной информации см. Раздел 8.9.4, "Кэширование Готовых Операторов и Сохраненных Программ".