MySQL 语句:数据处理语句(DML)

来自Wikioe
Eijux讨论 | 贡献2021年4月11日 (日) 19:31的版本 →‎CALL 语句
跳到导航 跳到搜索


关于

CALL 语句

CALL sp_name([parameter[,...]])
CALL sp_name[()]
  • CALL语句调用先前用“CREATE PROCEDURE”定义的存储过程。
  • 可以不带括号地调用不带参数的存储过程。也就是说,“CALL p()”和“CALL p”是等效的。
  • 【见:CREATE PROCEDURE 和 CREATE FUNCTION 语句


CALL可以使用声明为OUTINOUT参数的参数将值传递回其调用方。当过程返回时,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”:【???】
    1. 要编写使用CALL SQL 语句执行生成结果集的存储过程的 C 程序,必须启用“CLIENT_MULTI_RESULTS”标志。这是因为,除了过程中执行的语句可能返回的任何结果集之外,每个 CALL 还会返回指示呼叫状态的结果。如果将 CALL 用于执行任何包含准备好的语句的存储过程,则也必须启用“CLIENT_MULTI_RESULTS”。无法确定何时加载此类过程是否会产生这些语句,因此有必要假设它们会产生结果。
    2. 可以在调用“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 语句

DO 语句

HANDLER 语句

INSERT 语句

LOAD DATA 语句

LOAD XML 语句

REPLACE 语句

SELECT 语句

【子查询】

UPDATE 语句