文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9MB
PDF (A4) - 40.0MB
手册页 (TGZ) - 258.5KB
手册页 (Zip) - 365.5KB
信息 (Gzip) - 4.0MB
信息 (Zip) - 4.0MB


MySQL 8.4 参考手册  /  ...  /  局部变量作用域和解析

15.6.4.2 局部变量作用域和解析

局部变量的作用域是声明它的 BEGIN ... END 块。可以在声明块嵌套的块中引用该变量,但声明具有相同名称的变量的块除外。

因为局部变量仅在存储程序执行期间处于作用域内,所以在存储程序中创建的预处理语句中不允许引用它们。预处理语句的作用域是当前会话,而不是存储程序,因此可以在程序结束后执行该语句,此时变量将不再处于作用域内。例如,SELECT ... INTO local_var 不能用作预处理语句。此限制也适用于存储过程和函数参数。请参见 第 15.5.1 节“PREPARE 语句”。

局部变量不应与表列具有相同的名称。如果 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() 时,newname 变量将返回 'bob',而不管 table1.xname 列的值是多少。

类似地,以下过程中光标定义包含一个 SELECT 语句,该语句引用了 xname。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;

另见 第 27.8 节“存储程序的限制”。