写了一个很简单的存储过程,发现执行了,但是表的数据没有改变,存储过程如下:
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 根本没有起作用
所以要切记切记,存储工程参数名一定不要和表名相同