“MySQL 语句:数据处理语句(DML)”的版本间差异
跳到导航
跳到搜索
(→子查询) |
|||
第5行: | 第5行: | ||
== CALL 语句 == | == CALL 语句 == | ||
<syntaxhighlight lang="mysql"> | |||
CALL sp_name([parameter[,...]]) | |||
CALL sp_name[()] | |||
</syntaxhighlight> | |||
* CALL语句调用先前用“CREATE PROCEDURE”定义的存储过程。 | |||
* 可以不带括号地调用不带参数的存储过程。也就是说,“CALL p()”和“CALL p”是等效的。 | |||
* 【见:'''“[http://wiki.eijux.com/MySQL_%E8%AF%AD%E5%8F%A5%EF%BC%9A%E6%95%B0%E6%8D%AE%E5%AE%9A%E4%B9%89%E8%AF%AD%E5%8F%A5%EF%BC%88DDL%EF%BC%89#CREATE_PROCEDURE_.E5.92.8C_CREATE_FUNCTION_.E8.AF.AD.E5.8F.A5 CREATE PROCEDURE 和 CREATE FUNCTION 语句]”'''】 | |||
CALL可以使用声明为'''OUT'''或'''INOUT'''参数的参数将值传递回其调用方。当过程返回时,Client 端程序也可以获得在例程中执行的最终语句所影响的行数:在 SQL 级别,调用“'''ROW_COUNT()'''”函数;从 C API 中,调用“'''mysql_affected_rows()'''”函数。 | |||
* 对于“INOUT”参数,在将其值传递给过程之前对其进行初始化。 | |||
* 在与“PREPARE”和“EXECUTE”一起使用的已准备好的 CALL 语句中,占位符可用于 IN 参数,OUT 和 INOUT 参数。 | |||
示例:以下过程具有一个 OUT 参数,该参数将该过程设置为当前服务器版本,以及一个 INOUT 值,该过程从其当前值开始加一: | |||
<syntaxhighlight lang="mysql"> | |||
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; | |||
</syntaxhighlight> | |||
在调用该过程之前,初始化要作为INOUT参数传递的变量。调用该过程后,将设置或修改两个变量的值: | |||
<syntaxhighlight lang="mysql"> | |||
mysql> SET @increment = 10; | |||
mysql> CALL p(@version, @increment); | |||
mysql> SELECT @version, @increment; | |||
+------------------+------------+ | |||
| @version | @increment | | |||
+------------------+------------+ | |||
| 5.7.20-debug-log | 11 | | |||
+------------------+------------+ | |||
</syntaxhighlight> | |||
示例:在与 PREPARE 和 EXECUTE 一起使用的已准备好的 CALL 语句中,占位符可用于 IN 参数,OUT 和 INOUT 参数。这些类型的参数可以按如下方式使用: | |||
<syntaxhighlight lang="mysql"> | |||
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 | | |||
+------------------+------------+ | |||
</syntaxhighlight> | |||
* 关于“'''CLIENT_MULTI_RESULTS'''”:【???】 | |||
*# 要编写使用CALL SQL 语句执行生成结果集的存储过程的 C 程序,必须启用“CLIENT_MULTI_RESULTS”标志。这是因为,除了过程中执行的语句可能返回的任何结果集之外,每个 CALL 还会返回指示呼叫状态的结果。如果将 CALL 用于执行任何包含准备好的语句的存储过程,则也必须启用“CLIENT_MULTI_RESULTS”。无法确定何时加载此类过程是否会产生这些语句,因此有必要假设它们会产生结果。 | |||
*# 可以在调用“mysql_real_connect()”时启用“CLIENT_MULTI_RESULTS”,或者通过传递“CLIENT_MULTI_RESULTS”标志本身来显式,或者通过“CLIENT_MULTI_RESULTS”隐式传递(也将启用“CLIENT_MULTI_RESULTS”)。 “CLIENT_MULTI_RESULTS”默认启用。 | |||
* 要处理使用“mysql_query()”或“mysql_real_query()”执行的 CALL 语句的结果,请使用调用“mysql_next_result()”的循环来确定是否还有更多结果。【???】 | |||
* C 程序可以使用 Prepared-Statement 接口执行 CALL 语句并访问 OUT 和 INOUT 参数。这是通过使用调用“mysql_stmt_next_result()”的循环以确定是否还有更多结果来处理CALL语句的结果来完成的。【???】 | |||
== DELETE 语句 == | == DELETE 语句 == |
2021年4月11日 (日) 19:31的版本
关于
CALL 语句
CALL sp_name([parameter[,...]])
CALL sp_name[()]
- CALL语句调用先前用“CREATE PROCEDURE”定义的存储过程。
- 可以不带括号地调用不带参数的存储过程。也就是说,“CALL p()”和“CALL p”是等效的。
- 【见:“CREATE PROCEDURE 和 CREATE FUNCTION 语句”】
CALL可以使用声明为OUT或INOUT参数的参数将值传递回其调用方。当过程返回时,Client 端程序也可以获得在例程中执行的最终语句所影响的行数:在 SQL 级别,调用“ROW_COUNT()”函数;从 C API 中,调用“mysql_affected_rows()”函数。
- 对于“INOUT”参数,在将其值传递给过程之前对其进行初始化。
- 在与“PREPARE”和“EXECUTE”一起使用的已准备好的 CALL 语句中,占位符可用于 IN 参数,OUT 和 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 |
+------------------+------------+
- 关于“CLIENT_MULTI_RESULTS”:【???】
- 要编写使用CALL SQL 语句执行生成结果集的存储过程的 C 程序,必须启用“CLIENT_MULTI_RESULTS”标志。这是因为,除了过程中执行的语句可能返回的任何结果集之外,每个 CALL 还会返回指示呼叫状态的结果。如果将 CALL 用于执行任何包含准备好的语句的存储过程,则也必须启用“CLIENT_MULTI_RESULTS”。无法确定何时加载此类过程是否会产生这些语句,因此有必要假设它们会产生结果。
- 可以在调用“mysql_real_connect()”时启用“CLIENT_MULTI_RESULTS”,或者通过传递“CLIENT_MULTI_RESULTS”标志本身来显式,或者通过“CLIENT_MULTI_RESULTS”隐式传递(也将启用“CLIENT_MULTI_RESULTS”)。 “CLIENT_MULTI_RESULTS”默认启用。
- 要处理使用“mysql_query()”或“mysql_real_query()”执行的 CALL 语句的结果,请使用调用“mysql_next_result()”的循环来确定是否还有更多结果。【???】
- C 程序可以使用 Prepared-Statement 接口执行 CALL 语句并访问 OUT 和 INOUT 参数。这是通过使用调用“mysql_stmt_next_result()”的循环以确定是否还有更多结果来处理CALL语句的结果来完成的。【???】