文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  CALL 语句

15.2.1 CALL 语句

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

CALL 语句调用先前使用 CREATE PROCEDURE 定义的存储过程。

不带参数的存储过程可以在不带括号的情况下调用。也就是说,CALL p()CALL p 是等效的。

CALL 可以使用声明为 OUTINOUT 参数的参数将值传递回其调用者。当过程返回时,客户端程序还可以获取例程中执行的最终语句所影响的行数:在 SQL 级别,调用 ROW_COUNT() 函数;从 C API 调用 mysql_affected_rows() 函数。

有关未处理条件对过程参数的影响的信息,请参阅 第 15.6.7.8 节“条件处理和 OUT 或 INOUT 参数”

要从使用 OUTINOUT 参数的程序中获取返回值,请通过用户变量传递参数,然后在程序返回后检查变量的值。(如果您从另一个存储程序或函数中调用该程序,您也可以将例程参数或局部例程变量作为 ININOUT 参数传递。)对于 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 |
+----------+------------+
| 9.0.0   |         11 |
+----------+------------+

在与 PREPAREEXECUTE 一起使用的预处理 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 |
+----------+------------+
| 9.0.0   |         11 |
+----------+------------+

要编写使用 CALL SQL 语句来执行生成结果集的存储程序的 C 程序,必须启用 CLIENT_MULTI_RESULTS 标志。这是因为除了由程序中执行的语句可能返回的任何结果集之外,每个 CALL 都会返回一个结果以指示调用状态。CLIENT_MULTI_RESULTS 还必须在使用 CALL 执行任何包含预处理语句的存储程序时启用。在加载此类程序时,无法确定这些语句是否会生成结果集,因此有必要假设它们会生成结果集。

可以在调用 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 语句并访问 OUTINOUT 参数。这是通过使用调用 mysql_stmt_next_result() 的循环来处理 CALL 语句的结果来完成的,该循环用于确定是否还有更多结果。有关示例,请参阅 预处理 CALL 语句支持。提供 MySQL 接口的语言可以使用预处理的 CALL 语句直接检索 OUTINOUT 程序参数。

存储程序引用的对象的元数据更改会被检测到,并在下次执行程序时导致自动重新解析受影响的语句。有关更多信息,请参阅 “第 10.10.3 节 “预处理语句和存储程序的缓存””