跳到主要内容

CALL

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

CALL 语句的语法如下:

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

不带参数的存储过程在调用时可以不使用括号。例如,CALL proc()CALL proc 是等价的。

CALL 可以使用声明的 OUTINOUT 参数将值传递回调用者,调用 ROW_COUNT() 函数还可以获取例程中所有语句执行完成后所影响的行数;对于 C API,可以通过调用 mysql_affected_rows() 函数实现。

通过用户变量传递 OUTINOUT 参数从存储过程中获取值,然后在过程返回后检查变量的值。如果从另一个存储过程或函数中调用该过程,还可以将例程参数或局部例程变量作为 ININOUT 参数来传递值。对于 INOUT 参数,在将其传递给过程之前将值进行初始化。

如下示例中,存储过程有一个 OUT 参数,该参数设置为当前服务器版本,还有一个 INOUT 值,该值由该过程的当前值递增 2。

DELIMITER //

CREATE PROCEDURE proc (OUT ver_param VARCHAR(100), INOUT incr_param INT)
BEGIN
# 设置 OUT 参数的值
SELECT VERSION() INTO ver_param;
# 递增 INOUT 参数的值
SET incr_param = incr_param + 2;
END //
Query OK, 0 rows affected

在调用过程之前,初始化要作为 INOUT 参数传递的变量。调用该过程后,可以看到两个变量的值已被设置或修改,如下所示:

DELIMITER ;

SET @increment = 1;
Query OK, 0 rows affected

CALL proc(@obversion, @increment);
+------------------------------+------------+
| ver_param | incr_param |
+------------------------------+------------+
| 5.7.25-OceanBase_CE-v4.0.0.0 | 3 |
+------------------------------+------------+
1 row in set

SELECT @obversion, @increment;
+------------------------------+------------+
| @obversion | @increment |
+------------------------------+------------+
| 5.7.25-OceanBase_CE-v4.0.0.0 | 3 |
+------------------------------+------------+
1 row in set