存储程序中的变量

 Local Variable DECLARE Statement

DECLARE var_name [, var_name] ... type [DEFAULT value]

该语句在存储的程序中声明局部变量。要提供变量的默认值,请包含一个 DEFAULT子句。该值可以指定为表达式;它不必是常数。如果缺少该DEFAULT子句,则初始值为NULL

就数据类型和溢出检查而言,将本地变量像存储的例程参数一样对待。

变量声明必须出现在游标或处理程序声明之前。

局部变量的范围和解决方案

局部变量的名称不应与表列的名称相同。如果一条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 xname在 SELECT语句中将其解释为对xname 变量的引用, 而不是对xname 的引用因此,在sp1()调用该过程时 , newname变量将返回该值'bob',而与table1.xname的值 无关 

同样,以下过程中的游标定义包含一个SELECT引用语句xnameMySQL将此解释为对该名称变量的引用,而不是列引用。

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://www.cnblogs.com/wonchaofan/p/13521303.html