存储程序中的变量

 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;
复制代码

 

posted @   wongchaofan  阅读(134)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示