2012-02-07 28 views
1

我公司開發的PL/SQL存儲過程返回一個sys_refcursor存儲過程的sys_refcursor輸出是否被緩存?

create or replace procedure updateProgress(ref_out out sys_refcursor 
              , v_context in number) 
is 
begin 

    open ref_out 
    for select serial# serialnumber 
     , time_remaining remainingtime 
     , elapsed_seconds elapsedtime 
     , (100 * sofar)/totalwork accomplishedpercentage 
    from v$session_longops 
    where target = 9 
    and target_desc = 'inserting nonsense' 
    and context = v_context; 

end updateProgress; 

我要在一個會話中執行該過程的次數。在第一次調用之後,每個後續調用都會再次執行查詢還是第一個查詢的結果被緩存以供後續調用重用?

回答

2

它不會被緩存;該查詢將爲每個呼叫執行。

小心:查詢v$session_longops不是監視執行進度的非常可靠的方法。返回的數據並不總是滿的(例如,可能不包括所有的SQL語句),我絕對不會依賴於time_remaining值;對我來說,它往往似乎是一個瘋狂的猜測,而不是一個好的估計...

+0

你的答案是非常有用的。 'v $ session_longops'並不理想,但如果我不使用它,我該怎麼辦? – 2012-02-10 03:06:29

+0

對於長時間運行的單個SQL語句,您需要使用'v $ session_longops'。對於PL/SQL,您可以將執行信息記錄到表中,並且可以使用'dbms_application_info'包。 – 2012-02-10 07:13:21