0
我有一段代碼塊需要一些時間才能完成,並且我在表上創建了一個進度變量,進程將更新,以便最終用戶可以知道剩下多少要完成。保存點和提交之間的衝突
問題在於代碼塊被視爲原子事務,因此進度變量值將只顯示0%或100%,除非我使用commit
語句,該語句將刪除在上一個點上聲明的保存點塊,如果發生異常,它不會被識別爲有效。
的代碼是這樣的:
begin
/*do some stuff*/
savepoint p_savepoint;
for q in (somequery) loop /*Really long loop*/
/*Do some other stuff*/
update t_sys_state set p1_progress = percentage
where user_id = 'theuserid';
commit; /*This commit make the real progress value available*/
end loop;
exception
when others then
rollback to p_savepoint; /*This savepoint is not recognized because of the previous commit*/
raise;
end;
有沒有解決這個辦法嗎?
如果你只是想顯示你的循環的進度,你可能要考慮使用'dbms_application_info'代替,它可以讓你把信息轉化爲'V $ session_longops',看例如這裏:http://stackoverflow.com/a/40154203/330315 –
@a_horse_with_no_name謝謝,明天我會試試。 – Typo