现在的位置: 首页 > 综合 > 正文

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

2012年03月27日 ⁄ 综合 ⁄ 共 730字 ⁄ 字号 评论关闭

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

 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 根本没有起作用

 

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

抱歉!评论已关闭.