ora-01086错误

SAVEPOINT(保存点)是事务处理过程中的一个标志,与回滚命令(ROLLBACK)结合使用,主要的用途是允许用户将某一段处理回滚而不必回滚整个事务,这在PL/SQL开发中还是很有用处的。以下模拟两种情况:
      一. 开发环境。
    
           模拟代码:DECLARE
                             l_err_code number := 0; --catch exception in DML BLOCK
                         BEGIN
                             savepoint savepoint_test;
                             --DML BLOCK BEGIN
                                 ……
                             --DML BLOCK END
                             if  l_err_code != 0  then                        
                                 rollback to savepoint_test;      
                             else
                                 commit;
                             end if;                     
                         END;

       二. 修改情况(业务更改,增加或源程序发生bug,需要修改等)
                模拟代码:DECLARE
                              l_err_code number := 0; --catch exception in DML BLOCK
                          BEGIN
                              savepoint savepoint_test;
                              --DML BLOCK BEGIN
                                 --ALTER DML BEGIN
                                 ……
                                 COMMIT;
                                 --ALTER DML END

                                 --NEW DML BLOCK BEGIN
                                 ……
                                 COMMIT;
                                 --NEW DML BLOCK END
                              --DML BLOCK END
                              if  l_err_code != 0  then                        
                                 rollback to savepoint_test;      
                              else
                                 commit;
                              end if;                     
                         END;
            以上蓝色部分或者红色部分的COMMIT,会导致ORA-01086: savepoint "string" never established。

      总结:一,开发阶段,编码者常常不会忘记savepoint建立点和回滚代码之间不能COMMIT。
              二,原程序在上线后或者上线前(经历了长时间后),由编码者或者其他同事进行修改时,容易忽视savepoint的存
                    在,从而导致键入了COMMIT。
                    同时,测试时,没有发生error,导致bug没有暴露。容易成为上线后的隐含bug。

      把蓝色sql语句换成动态sql 大家可以试试 

      不知道大家有没有碰到过这种情况呢?本人和身边一位同事亲身经历了,呵呵~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值