13.2.1 CALL 声明
CALL sp_name([parameter[,...]])
CALL sp_name[()]
CALL语句调用先前用CREATE PROCEDURE定义的存储过程。
可以不带括号地调用不带参数的存储过程。也就是说,CALL p()
和CALL p
是等效的。
CALL可以使用声明为OUT
或INOUT
参数的参数将值传递回其调用方。当过程返回时,Client 端程序也可以获得在例程中执行的最终语句所影响的行数:在 SQL 级别,调用ROW_COUNT()函数;从 C API 中,调用mysql_affected_rows()函数。
有关未处理条件对过程参数的影响的信息,请参见第 13.6.7.8 节“条件处理和 OUT 或 INOUT 参数”。
要使用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.7.20-debug-log | 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 |
+------------------+------------+
| 5.7.20-debug-log | 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()的循环来确定是否还有更多结果。有关示例,请参见第 27.7.15 节“ C API 多语句执行支持”。
C 程序可以使用 Prepared-Statement 接口执行CALL语句并访问OUT
和INOUT
参数。这是通过使用调用mysql_stmt_next_result()的循环以确定是否还有更多结果来处理CALL语句的结果来完成的。有关示例,请参见第 27.7.17 节“ C API 编写的 CALL 语句支持”。提供 MySQL 接口的语言可以使用准备好的CALL语句直接检索OUT
和INOUT
过程参数。
检测到存储程序引用的对象的元数据更改,并在下次执行该程序时导致受影响语句的自动重新解析。有关更多信息,请参见第 8.10.4 节“准备好的语句和存储程序的缓存”。