zoukankan      html  css  js  c++  java
  • 存储过程中参数与表名相同的二义性问题

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

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

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

  • 相关阅读:
    Vue
    Vue
    Vue
    Vue
    Vue
    Vue
    Vue
    Vue
    Vue
    建立索引该如何选取字段
  • 原文地址:https://www.cnblogs.com/ac1985482/p/2840466.html
Copyright © 2011-2022 走看看