Spec-Zone .ru
спецификации, руководства, описания, API
|
CALLsp_name
([parameter
[,...]])CALLsp_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.7, CLIENT_MULTI_RESULTS
включается по умолчанию.
Обработать результат a CALL
оператор выполнил использование mysql_query()
или mysql_real_query()
,
используйте цикл, который вызывает mysql_next_result()
определить, есть ли больше результатов. Для примера см. Раздел
21.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.7, C программы может использовать интерфейс готового оператора, чтобы выполниться CALL
операторы и доступ OUT
и INOUT
параметры. Это делается, обрабатывая результат a CALL
оператор используя цикл, который вызывает mysql_stmt_next_result()
определить, есть ли больше результатов. Для примера
см. Раздел 21.8.20, "Поддержка API C
Готового CALL
Операторы". Языки, которые обеспечивают интерфейс MySQL,
могут использовать подготовленный CALL
операторы, чтобы непосредственно получить OUT
и INOUT
параметры процедуры.
В MySQL 5.7 метаданные изменяются на объекты, упомянутые сохраненными программами, обнаруживаются и вызывают автоматический перепарсинг операторов, на которые влияют, когда программа затем выполняется. Для получения дополнительной информации см. Раздел 8.9.4, "Кэширование Готовых Операторов и Сохраненных Программ".