oracle update存储过程调用执行不成功的几个原因

在创建Oracle更新存储过程时,遇到更新未成功的问题。错误源于存储过程中的变量名与表字段名相同,导致更新无效。解决办法是避免变量与表字段重名,特别是用于`SET`赋值和`WHERE`条件的变量。此外,存储过程执行成功但未更新表可能是因为变量长度不匹配或字符类型比较错误。通过调整变量命名和类型匹配,问题得到解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在建立update存储过程时,调用一直没能存储进去,虽然显示存储成功,但是在查询后显示表未被修改,在参考了http://lin49940.iteye.com/blog/466626文章后进行了修改,终于发现了错误的几个原因:

1、对于预定义变量不能与表中列名相同(参考http://lin49940.iteye.com/blog/466626

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

      creat or replace procedure p_AA

      is

          t_type varchar2(20);

          code number(10);

      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' 是不对等的, 这也是容易犯的一个错误, 在此记录下)

2、对于 参数变量要区别对待:

(1)对于要记性set赋值的变量同样是不能重名的;

这个在http://lin49940.iteye.com/blog/466626文章中未提到,刚开始我以为也是可以的~最后发现自己的原因就是出在这上面

SQL> create or replace procedure  update_young(
  2      pat_ID              VARCHAR2,
  3      young_1             INTEGER,
  4      young_2             INTEGER,
  5      young_3             INTEGER,
  6      young_4             INTEGER,
  7      young_5             INTEGER,
  8      young_6             INTEGER,
  9      young_7             INTEGER,
 10      young_8             INTEGER,
 11      young_Score         INTEGER)
 12  is
 13  begin
 14  update admin.young_tab set
 15  admin.young_tab.young_1= young_1,
 16  admin.young_tab.young_2= young_2, admin.young_tab.young_3 = young_3, admin.young_tab.young_4 = young_4, admin.young_tab.young_5=young_5  ,
 17  admin.young_tab.young_6=young_6,admin.young_tab.young_7=young_7,admin.young_tab.young_8=young_8,admin.young_tab.young_Score=young_Score
 18   where admin.young_tab.pat_id=pat_ID;
 19   commit;
 20  end update_young;
 21  /
 
Procedure created

进行调用: exec update_young('p2',1,1,1,1,1,1,1,1,9);同样表未被修改存储,在修改复制变量名字后就好了

(2) 对于是要在where语句中进行判断的语句则是可以重名的;

这个在http://lin49940.iteye.com/blog/466626中进行了实验。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值