存储程序中的变量
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
引用的语句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;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了