【问题标题】:ora-01086 : save point was not established or invalidora-01086 : 保存点未建立或无效
【发布时间】:2014-02-03 23:47:33
【问题描述】:

Ora-01086:保存点未建立或无效。 KRD_UPD_BORCTAHSILATYAP_SP 这个 SP 抛出错误。 当我在下面测试这个循环时,我得到了错误:ora-01086

通常它无需调用外部 sp 即可工作,我使用内联错误对其进行测试,然后回滚到保存点。我错过了什么?

FOR rec IN (...records.....
               )
   LOOP
      SAVEPOINT odemeIslemiBaslangic;
      BEGIN


         CASE rec.prosedur_ad
            WHEN 'KRD' THEN

               KRD_UPD_BORCTAHSILATYAP_SP(rec.musterino, rec.urundegeri, rec.taksitno, v_MuhasebeReferans, v_IslemReferans, v_Tarih);
               IF v_MuhasebeReferans IS NOT NULL THEN
                  v_SonucKd  := 10;
                  v_Aciklama := 'Başarılı işlem';
               ELSE
                  v_SonucKd  := 9;
                  v_Aciklama := 'Borç bulunamadı';
               END IF;

         END CASE;
         cll_ins_tahsilatislem_sp(p_odemeno        => rec.odemeno,
                                  p_islemtarihi    => v_Tarih,
                                  p_musterino      => rec.musterino,
                                  p_urundeger      => rec.urundegeri,
                                  p_islemref       => v_IslemReferans,
                                  p_muhasebesubekd => rec.sube_kd,
                                  p_muhaseberef    => v_MuhasebeReferans,
                                  p_aciklama       => v_Aciklama,
                                  p_sonuc          => v_SonucKd,
                                  p_kayityapan     => v_KayitYapan,
                                  p_kayittrxkod    => v_KayitTrxKod);
         UPDATE cll_gecikmisbankaalacak u
            SET u.sonuc_kd = v_SonucKd
          WHERE u.odemeno = rec.odemeno
            AND u.kayit_drm = 'A';
      EXCEPTION
         WHEN OTHERS THEN
            ROLLBACK TO SAVEPOINT odemeIslemiBaslangic;
            v_SonucKd  := 1;
            v_Aciklama := 'İşlem Hata: ' || substr(SQLERRM, 1, 400);
            cll_ins_tahsilatislem_sp(p_odemeno        => rec.odemeno,
                                     p_islemtarihi    => v_Tarih,
                                     p_musterino      => rec.musterino,
                                     p_urundeger      => rec.urundegeri,
                                     p_islemref       => v_IslemReferans,
                                     p_muhasebesubekd => rec.sube_kd,
                                     p_muhaseberef    => v_MuhasebeReferans,
                                     p_aciklama       => v_Aciklama,
                                     p_sonuc          => v_SonucKd,
                                     p_kayityapan     => v_KayitYapan,
                                     p_kayittrxkod    => v_KayitTrxKod);
            UPDATE cll_gecikmisbankaalacak u
               SET u.sonuc_kd = v_SonucKd
             WHERE u.odemeno = rec.odemeno
               AND u.kayit_drm = 'A';
      END;

   END LOOP;

【问题讨论】:

  • 我不确定,但我认为最好在循环之外使用您的 SAVEPOINT
  • KRD_UPD_BORCTAHSILATYAP_SP 错误回滚;如果有,在哪里?
  • 是的,它会自行回滚。或提交。 @AlexPoole
  • 它回滚整个事务,而不是回滚到它自己的保存点?然后你在调用过程中建立的保存点将被清除。

标签: sql oracle plsql oracle11g savepoints


【解决方案1】:

您的评论表明您正在调用的过程KRD_UPD_BORCTAHSILATYAP_SP 正在回滚整个事务,即发出一个简单的ROLLBACK

来自documentation for ROLLBACK

使用不带TO SAVEPOINT 子句的ROLLBACK 执行以下操作:

  • 结束交易
  • 撤消当前事务中的所有更改
  • 清除事务中的所有保存点
  • 释放所有事务锁

因此,您在调用块中建立的保存点将被删除,因此您不能再回滚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 2014-10-14
    相关资源
    最近更新 更多