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
参数从存储过程获取返回值,请通过用户变量传递参数,然后在存储过程返回后检查变量的值。(如果从另一个存储过程或函数中调用存储过程,也可以将例程参数或局部例程变量作为 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.4.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.4.0 | 11 |
+----------+------------+
要编写使用 CALL
SQL 语句执行生成结果集的存储过程的 C 程序,必须启用 CLIENT_MULTI_RESULTS
标志。这是因为除了存储过程中执行的语句可能返回的任何结果集之外,每个 CALL
都会返回一个结果以指示调用状态。如果 CALL
用于执行任何包含预处理语句的存储过程,则还必须启用 CLIENT_MULTI_RESULTS
。在加载此类存储过程时,无法确定这些语句是否会生成结果集,因此必须假设它们会生成结果集。
可以在调用 mysql_real_connect()
时启用 CLIENT_MULTI_RESULTS
,方法是显式传递 CLIENT_MULTI_RESULTS
标志本身,或者隐式传递 CLIENT_MULTI_STATEMENTS
(这也将启用 CLIENT_MULTI_RESULTS
)。默认情况下启用 CLIENT_MULTI_RESULTS
。
要处理使用 mysql_query()
或 mysql_real_query()
执行的 CALL
语句的结果,请使用一个循环调用 mysql_next_result()
来确定是否有更多结果。有关示例,请参见 多语句执行支持。
C 程序可以使用预处理语句接口执行 CALL
语句并访问 OUT
和 INOUT
参数。这是通过使用循环处理 CALL
语句的结果来完成的,该循环调用 mysql_stmt_next_result()
来确定是否有更多结果。有关示例,请参见 预处理 CALL 语句支持。提供 MySQL 接口的语言可以使用预处理的 CALL
语句直接检索 OUT
和 INOUT
存储过程参数。
对存储程序引用的对象的元数据更改会被检测到,并在下次执行程序时导致自动重新解析受影响的语句。有关更多信息,请参见 第 10.10.3 节“预处理语句和存储程序的缓存”。