CALL sp_name([parameter[,...]])
CALL sp_name[()]
该 CALL 语句调用之前使用 CREATE PROCEDURE 定义的存储过程。
不带参数的存储过程可以不带括号调用。即,CALL p() 和 CALL p 是等效的。
CALL 可以使用声明为 OUT 或 INOUT 的参数将值传回调用方。当过程返回时,客户端程序也可以获取最后执行的语句所影响的行数:在 SQL 级别上,调用 ROW_COUNT() 函数;从 C API 中,调用 mysql_affected_rows() 函数。
有关未处理条件对过程参数的影响,请参阅 第 15.6.7.8 节,“条件处理和 OUT 或 INOUT 参数”。
要从过程中获取值使用 OUT 或 INOUT 参数,通过用户变量传递参数,然后在过程返回后检查变量的值。(如果您从另一个存储过程或函数中调用该过程,可以将routine 参数或局部 routine 变量作为 IN 或 INOUT 参数传递。)对于 INOUT 参数,在传递之前初始化其值。以下过程具有一个 OUT 参数,该过程将其设置为当前服务器版本,并且具有一个 INOUT 值,该过程将其从当前值增加 1:
DELIMITER //
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 //
DELIMITER ;
在调用过程之前,初始化要作为 INOUT 参数传递的变量。调用过程后,您可以看到两个变量的值被设置或修改:
mysql> SET @increment = 10;
mysql> CALL p(@version, @increment);
mysql> SELECT @version, @increment;
+----------+------------+
| @version | @increment |
+----------+------------+
| 8.3.0 | 11 |
+----------+------------+
在使用 PREPARE 和 EXECUTE 的准备好的 CALL 语句中,可以使用占位符代替 IN 参数、OUT 和 INOUT 参数。这些类型的参数可以如下使用:
mysql> SET @increment = 10;
mysql> PREPARE s FROM 'CALL p(?, ?)';
mysql> EXECUTE s USING @version, @increment;
mysql> SELECT @version, @increment;
+----------+------------+
| @version | @increment |
+----------+------------+
| 8.3.0 | 11 |
+----------+------------+
要编写使用 CALL SQL 语句来执行存储过程的 C 程序,必须启用 CLIENT_MULTI_RESULTS 标志。这是因为每个 CALL 都会返回一个结果来指示调用状态,除了可能由过程中执行的语句返回的结果集以外。CLIENT_MULTI_RESULTS 也必须启用,如果 CALL 用于执行包含预备语句的存储过程。无法确定在加载过程时这些语句是否生成结果集,因此必须假设它们生成结果集。
CLIENT_MULTI_RESULTS 可以在调用 mysql_real_connect() 时启用,或者通过传递 CLIENT_MULTI_STATEMENTS(也启用 CLIENT_MULTI_RESULTS)隐式启用。CLIENT_MULTI_RESULTS 默认启用。
要处理使用 mysql_query() 或 mysql_real_query() 执行的 CALL 语句的结果,使用一个循环调用 mysql_next_result() 来确定是否有更多结果。例如,见 多语句执行支持。
C 程序可以使用预备语句接口来执行 CALL 语句并访问 OUT 和 INOUT 参数。这是通过使用一个循环调用 mysql_stmt_next_result() 来确定是否有更多结果。例如,见 预备 CALL 语句支持。提供 MySQL 接口的语言可以使用预备 CALL 语句直接检索 OUT 和 INOUT 过程参数。
存储程序引用的对象的元数据更改将被检测到,并在下一次执行时自动重新解析受影响的语句。有关更多信息,见 第 10.10.3 节,“预备语句和存储程序的缓存”。