使用V $ _SESSION_LONGOPS的進展,需要設置TIMED_STATISTICS = true或SQL_TRACE = TRUE。您的數據庫模式必須被授予ALTER SESSION系統特權才能這樣做。
我曾嘗試使用V $ _SESSION_LONGOPS處理複雜和長時間運行的查詢。但是,它發現V $ _SESSION_LONGOPS可能會顯示像全表掃描,聯合操作等查詢的部分的進度。
參見:http://www.dba-oracle.com/t_v_dollar_session_longops.htm
你可以做的就是向用戶顯示「查詢仍在運行」。我實現了嵌入到<TD>
中的<DIV>
,該瀏覽器發送的每個狀態請求都會變得更長。狀態請求由window.SetTimeout
(每3秒)發起,並且是對服務器端過程的AJAX調用。服務器端程序返回的狀態報告只是說「我們仍在運行」。進度條的寬度(即<DIV>
的寬度)每次增加5%,並在顯示100%後重置爲5%。
對於長時間運行的查詢,您可能會跟蹤他們在單獨的表中所佔用的時間,可能會用單個條目來改變where子句。您可以使用它來顯示平均時間加上客戶端對話框中剛過去的時間。
如果你有一個長期運行的PL/SQL程序或服務器端做的幾個步驟等等,試試這個:
- 創建狀態消息表
- 使用唯一密鑰的任何進程用戶啓動。建議:客戶端的JavaScript日期以毫秒爲單位+會話ID。
- 的情況下長時間運行的程序是在瀏覽器窗口中的鏈接來啓動,使用DBMS_JOB.SUBMIT運行的程序,而不是直接運行
- 寫更新狀態表一小段程序的程序創建一個作業,使用PRAGMA AUTONOMOUS_TRANSACTION。該編譯指示允許您在不提交主程序更新的情況下提交狀態表的更新。主程序的每個主要步驟都應該在此狀態表中有一個自己的輸入。
- 寫了一個程序來查詢狀態表由瀏覽器被稱爲
- 寫一個由AJAX調用,如果使用點擊「取消」或關閉窗口
- 寫了一個程序被稱爲調用的過程通過完成每個步驟後的主要過程:如果設置了取消標誌或者瀏覽器未查詢狀態(例如60秒),則查詢狀態表,並以20000s內的數字引發異常。在主過程的異常處理程序中查找此錯誤,執行回滾並更新狀態表。
如果您有100 x 1秒的操作。他們都不會出現在SESSION_LONGOPS中。如果你有兩個連續十秒的操作,在你的第一個命中100%之後,第二個將從0%開始。這將是一個令人沮喪的進度條。我認爲這是需要捻轉圈的事情之一,而不是狀態欄,因爲你只是不知道需要多長時間。 – 2013-04-10 23:41:45