【发布时间】: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