Oracle存储过程执行update语句不报错不生效问题

转载连接:http://lin49940.iteye.com/blog/466626oracle


今天一个同事写oracle 的存储过程遇到了一个问题, 他在里面update 操做不能完成更新的操做, 可是又不会报错.spa

 

      如一个表 A(id, code, name, type)调试

 

      在存储过程当中的更新操做的语句: update A x set x.type = 变量A where x.code = 变量B; code

    

      变量A 和 变量B 都定义好了, 而且都成功赋值了.blog

 

      这是一个很简单的更新语句, 简单到一开始对为何发生这样的错误不知所措. 其实出错的缘由是在于 变量A 或 变量B 的定义上, 如:get

 

      creat or replace procedure p_AA博客

      isit

          t_type varchar2(20);变量

          code number(10);date

      begin

           t_type := 'AA';

           code := 100

           update A x set x.type = t_type  where x.code = code 

           commit;

      end;

 

      执行成功, 可是update 操做没有成功, 没有报什么错误. 其实缘由在于变量code 跟 表A 中的字段code 的名字相同形成的. 看下面的:

 

      

      creat or replace procedure p_AA

      is

          t_type varchar2(20);

          t_code number(10);

      begin

           t_type := 'AA';

           t_code := 100

           update A x set x.type = t_type  where x.code = t_code ; 

           commit;

      end;

 

       执行成功, update操做也成功. 因此缘由在与变量的名称上面(还有一个值得注意的地方, 若是code字段是char型的, 变量的长度跟字段code的长度若是不一致, 比较会不成功,'     100' 和 '100' 是不对等的, 这也是容易犯的一个错误, 在此记录下)

 

       还有一个地方要注意:

      creat or replace procedure p_AA(code in number) --code做为参数, 就算跟表A 的字段名称同样, 也不会有影响

      is

          t_type varchar2(20);

      begin

           t_type := 'AA';

           update A x set x.type = t_type  where x.code = code ; 

           commit;

      end;

 

      执行 execute p_AA(100) 成功, 更新操做也成功. code若是是参数, 跟表A 的字段名称同样, 也不会有影响.

 

 我通常变量都会加t_ 或 p_, 因此之前没遇到这个问题, 为了防止之后可能再次遇到这个问题和也遇到这个问题的朋友, 在此留下这篇博客做为备忘.




小龙评论


平时不多写Oracle的存储过程,最近为了处理一批异常的数据,嫌写程序调试麻烦,就使用存储过程,遇到了相同问题,是变量名和要更新的表字段名相同了。

不报错,的确不方便找缘由,转载备忘。