CALL语句
CALL sp_name([parameter[,...]])CALL sp_name[()]
该CALL
语句调用先前用定义的存储过程CREATE PROCEDURE
。
可以不带括号地调用不带参数的存储过程。也就是说,CALL p()
并且CALL p
是等效的。
CALL
可以使用声明为OUT
或INOUT
参数的参数将值传递回其调用方。当过程返回时,客户端程序还可以获得在例程中执行的最终语句所影响的行数:在SQL级别,调用ROW_COUNT()
函数;在SQL级别上,调用函数。从C API中,调用该mysql_affected_rows()
函数。
有关未处理条件对过程参数的影响的信息,请参见“条件处理和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 parameterSELECT VERSION()INTO ver_param; # Increment value of INOUT parameterSET incr_param = incr_param + 1;END ;
在调用该过程之前,请初始化要作为INOUT
参数传递的变量。调用该过程后,将设置或修改两个变量的值:
mysql>SET @increment = 10; mysql>CALL p(@version, @increment); mysql>SELECT @version, @increment; +-------------------- +------------ + | @version | @increment | +-------------------- +------------ + | 8.0.3 -rc -debug -log | 11 | +-------------------- +------------ +
在CALL
与PREPARE
和EXECUTE
一起使用的准备好的语句中,占位符可用于IN
参数OUT
和INOUT
。这些类型的参数可以按如下方式使用:
mysql>SET @increment = 10; mysql>PREPARE sFROM 'CALL p(?, ?)'; mysql>EXECUTE sUSING @version, @increment; mysql>SELECT @version, @increment; +-------------------- +------------ + | @version | @increment | +-------------------- +------------ + | 8.0.3 -rc -debug -log | 11 | +-------------------- +------------ +
要编写使用CALL
SQL语句执行产生结果集的存储过程的C程序,CLIENT_MULTI_RESULTS
必须启用该标志。这是因为CALL
,除了在过程中执行的语句可能返回的任何结果集之外,每个返回的结果还指示调用状态。CLIENT_MULTI_RESULTS
如果CALL
用于执行包含准备好的语句的任何存储过程,则还必须将其启用。无法确定何时加载这样的过程是否这些语句将产生结果集,因此有必要假设它们会产生结果集。
CLIENT_MULTI_RESULTS
可以在您调用时启用mysql_real_connect()
,可以通过传递CLIENT_MULTI_RESULTS
标志本身来显式地传递CLIENT_MULTI_STATEMENTS
,也可以通过传递来隐式传递(这也启用CLIENT_MULTI_RESULTS
)。CLIENT_MULTI_RESULTS
默认情况下启用。
要处理CALL
使用mysql_query()
或执行的语句的结果mysql_real_query()
,请使用一个循环,该循环调用mysql_next_result()
以确定是否还有更多结果。有关示例,请参见“ C API多语句执行支持”。
C程序可以使用Prepared-Statement接口执行CALL
语句以及访问OUT
和INOUT
参数。这是通过CALL
使用循环来处理语句的结果来完成的,该循环调用mysql_stmt_next_result()
以确定是否还有更多结果。有关示例,请参见“ C API编写的CALL语句支持”。提供MySQL接口的语言可以使用准备好的CALL
语句直接检索OUT
和INOUT
处理参数。
检测到存储程序引用的对象的元数据更改,并在下次执行该程序时导致受影响语句的自动重新分析。有关更多信息,请参见“缓冲和缓存”。