sql - una - ora-01086: el punto de guardado no se estableció o no es válido
tipo de datos time sql server (1)
Ora-01086: el punto de guardado no se estableció o no es válido. KRD_UPD_BORCTAHSILATYAP_SP este SP arroja errores. Cuando pruebo este ciclo a continuación, obtengo el error: ora-01086
Normalmente funciona sin llamar a un sp externo, lo pruebo con un error en línea y retrocedo al punto de guardado. Qué me estoy perdiendo ?
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;
Su comentario sugiere que el procedimiento que está llamando, KRD_UPD_BORCTAHSILATYAP_SP
, está KRD_UPD_BORCTAHSILATYAP_SP
toda la transacción, es decir, emitiendo un ROLLBACK
simple.
De la documentación para ROLLBACK
:
El uso de
ROLLBACK
sin la cláusulaTO SAVEPOINT
realiza las siguientes operaciones:
- Finaliza la transacción
- Deshace todos los cambios en la transacción actual
- Borra todos los puntos de guardado en la transacción
- Libera cualquier bloqueo de transacciones
Por lo tanto, el punto de rescate que estableció en su bloque de llamadas se borra, por lo que ya no puede retroceder a eso.