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

MySQL的SQL语句 -复合语句(4) - 局部变量范围

数据库杂货铺 2021-04-12
366
局部变量范围
 
局部变量的作用域是声明它的 BEGIN ... END 块。变量可以在嵌套在声明块中的块中引用,但声明同名变量的块除外。
 
因为局部变量只在存储程序执行期间才在作用域内,所以在存储程序中创建的预编译语句中不允许引用它们。预编译语句作用范围是当前会话,而不是存储程序,因此语句可以在程序结束后执行,此时变量将不再在作用域中。例如,SELECT ... INTO local_var 不能用作预编译语句。此限制也适用于存储过程和函数参数。
 
局部变量不应与表列具有相同的名称。如果 SQL 语句,例如 SELECT ... INTO 语句,包含对列的引用和声明的同名局部变量,MySQL 当前将引用解释为变量名称。考虑以下程序定义:
 
    CREATE PROCEDURE sp1 (x VARCHAR(5))
    BEGIN
    DECLARE xname VARCHAR(5) DEFAULT 'bob';
    DECLARE newname VARCHAR(5);
    DECLARE xid INT;


    SELECT xname, id INTO newname, xid
    FROM table1 WHERE xname = xname;
    SELECT newname;
    END;
     
    MySQL将 SELECT 语句中的 xname 解释为对 xname 变量的引用,而不是 xname 列。因此,当调用程序 sp1() 时,无论 table1.xname 列的值如何,newname 变量都返回值 'bob'
     
    类似地,以下程序中的游标定义包含一个引用 xname 的 SELECT 语句。MySQL 将其解释为对该名称的变量的引用,而不是列引用。
     
      CREATE PROCEDURE sp2 (x VARCHAR(5))
      BEGIN
      DECLARE xname VARCHAR(5) DEFAULT 'bob';
      DECLARE newname VARCHAR(5);
      DECLARE xid INT;
      DECLARE done TINYINT DEFAULT 0;
      DECLARE cur1 CURSOR FOR SELECT xname, id FROM table1;
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;


      OPEN cur1;
      read_loop: LOOP
      FETCH FROM cur1 INTO newname, xid;
      IF done THEN LEAVE read_loop; END IF;
      SELECT newname;
      END LOOP;
      CLOSE cur1;
      END;
       
       
       
       
      官方网址:
      https://dev.mysql.com/doc/refman/8.0/en/local-variable-scope.html


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

      评论