mysql存储过程参数与属性同名问题_存储过程中参数与表名相同的二义性问题

写了一个很简单的存储过程,发现执行了,但是表的数据没有改变,存储过程如下:

procedure sp_upd_update_jsgl(mc in varchar2,--名称

sm in varchar2--说明

)

is

begin

update jsgl set sm=sm where mc =mc ;

end

where后面的名称执行的时候mc=mc并不是jsgl.mc=mc 而是和1=1一样的参数,而参数mc和jsgl.mc产生了二义性,所以后面的参数修改成了jsgl.mc=mc

这个存储过程就变成了这样

procedure sp_upd_update_jsgl(mc in varchar2,--名称

sm in varchar2--说明

)

is

begin

update jsgl set sm=sm where jsgl.mc =mc ;

end ;

但是这里的sm这个字段并没有改变 ,存储过程却是执行完成了,但是考虑到set后面的语句前面是表名,后面是参数,应该不会存在问题的。其实这里还是一样有问题,只是这个条件等同于jsgl.sm=jsgl.sm,这样update执行成功了,但是值却没有被修改。

也就是说我们写的第一个存储过程是等于下面的一条语句

procedure sp_upd_update_jsgl(t_mc in varchar2,--名称

t_sm in varchar2--说明

)

is

begin

update jsgl set jsgl.sm=jsgl.sm where t_mc =t_mc ;

end ;

这样的语句是成功了,但是值修改的时候还是原来的值而且这个update等同于 update jsgl set jsgl.sm=jsgl.sm where 1=1是一样的 where 根本没有起作用

所以要切记切记,存储工程参数名一定不要和表名相同

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值