暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL的SQL语句 - 数据操作语句(1)- CALL 语句

数据库杂货铺 2021-04-12
1609
CALL 语句
 
    CALL sp_name([parameter[,...]])
    CALL sp_name[()]
    复制
     
    CALL 语句调用 CREATE PROCEDURE 定义的存储过程。
     
    如果存储过程不带参数,调用时可以在不带括号。也就是说,CALL p() 和 CALL p 是等价的。
     
    CALL 可以使用声明为 OUT INOUT 的参数将值回传给它的调用者。当过程返回时,客户端程序还可以获得例程中执行的最后一条语句所影响的行数: SQL 级别,调用 ROW_COUNT() 函数;C API 中,调用 mysql_affected_rows() 函数。
     
    要使用 OUT 或 INOUT 参数从过程中获取值,请通过用户变量传递该参数,然后在过程返回后检查变量的值。(如果从另一个存储过程或函数中调用该过程,还可以将例程参数或本地例程变量作为 IN INOUT 参数传递。)对于 INOUT 参数,请在将其传递给过程之前对其值进行初始化。下面的过程有一个 OUT 参数,该过程将其设置为当前服务器版本,以及一个 INOUT 值,该过程将其当前值递增 1:
     
      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 |
        +--------------------+------------+
        | 8.0.3-rc-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 |
          +--------------------+------------+
          | 8.0.3-rc-debug-log | 11 |
          +--------------------+------------+
          复制
           
          要编写使用 CALL SQL 语句执行产生结果集的存储过程的 C 程序,必须启用 CLIENT_MULTI_RESULTS 标志。这是因为除了过程中执行的语句可能返回的结果集之外,每个 CALL 还返回一个结果来指示调用状态。如果使用 CALL 执行任何包含预编译语句的存储过程,也必须启用 CLIENT_MULTI_RESULTS。在加载过程中不能确定这些语句是否会产生结果集,因此有必要假定它们会产生结果集。
           
          可以在调用 mysql_real_connect() 时显式地传递 CLIENT_MULTI_RESULTS 标志本身,或者隐式传递CLIENT_MULTI_STATEMENTS 来启用 CLIENT_MULTI_RESULTS。默认情况下 CLIENT_MULTI_RESULTS 是启用的。
           
          要处理使用 mysql_query() 或 mysql_real_query() 执行的 CALL 语句的结果,可以使用一个调用 mysql_next_result() 的循环来确定是否有更多的结果。
           
          C 程序可以使用预编译语句接口来执行 CALL 语句并访问 OUT INOUT 参数。这是通过使用循环处理 CALL 语句的结果来完成的,该循环调用 mysql_stmt_next_result() 来确定是否有更多的结果。提供 MySQL 接口的语言可以使用预编译的 CALL 语句直接检索 OUT INOUT 过程参数。
           
          存储程序引用的对象的元数据更改将被检测到,并在下次执行程序时自动重新解析受影响的语句。
           
           
           
           
           
           
          官方文档:
          https://dev.mysql.com/doc/refman/8.0/en/call.html
           

          文章转载自数据库杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论