2011-09-06 88 views
3

我想用Oracle SQL Developer異步執行一個存儲過程很多次。在sql developer中執行異步存儲過程

僞碼

var pStatus number 
var pOraErrCd varchar2 
var pOraErrMsg varchar2 
for i 1 .. 1000 -- do async 
loop 
    exec myproc('test',:pStatus ,:pOraErrCd ,:pOraErrMsg); 
end loop; 

存儲過程的目的是爲了做一些插入。爲了測試,我只是想要異步執行存儲過程很多次。我不在乎任何返回值。

是否有一個「易」方式做到這一點?

+0

您是否想要一個會話在除您自己以外的會話中調用過程1000次?或者你想讓N個會話同時執行1000/N次的程序? –

+0

假設您需要多個會話來異步執行該過程,N個會話每次同時執行過程1000次/ N次。 – kralco626

+0

我想模擬從外部進程快速調用的存儲過程。 – kralco626

回答

5

由於要模擬N個會話的每個調用程序1000/N次,我可能會做一些像

CREATE OR REPLACE PROCEDURE call_myproc_n_times(p_n IN NUMBER) 
AS 
    p_status   NUMBER; 
    p_ora_error_code VARCHAR2(1000); 
    p_ora_error_msg VARCHAR2(1000); 
BEGIN 
    FOR i IN 1 .. p_n 
    LOOP 
    myproc('test', 
      p_status, 
      p_ora_error_code, 
      p_ora_error_msg); 
    END LOOP; 
END; 

DECLARE 
    l_num_sessions  number := 10; 
    l_exec_per_session number := 100; 
    l_jobno   pls_integer; 
BEGIN 
    FOR i IN 1 .. l_num_sessions 
    LOOP 
    dbms_job.submit( 
     l_jobno, 
     'BEGIN ' || 
     ' call_myproc_n_times(' || l_exec_per_session || '); ' || 
     'END;', 
     sysdate + interval '1' minute); 
    END LOOP; 
    commit; 
END; 

這個例子將啓動10次,每個都將在快速執行程序100倍繼承假設你的數據庫的JOB_QUEUE_PROCESSES至少是10,這意味着Oracle可以同時在後臺運行10個作業。創建CALL_MYPROC_N_TIMES過程並非嚴格必要 - 它只是使構建字符串在工作中更容易執行。

另一種方法是提交1000個作業,每個作業只調用MYPROC一次,並依靠參數JOB_QUEUE_PROCESSES限制同時運行的作業數量。如果您想要運行更少的同時進行的會話,那麼這將工作,但要更改數據庫參數更加困難 - 在我發佈的代碼中調整L_NUM_SESSIONS很容易。

+0

很好,我很快就會試用它。我會告訴你它是如何工作的。在此期間+1 – kralco626

+0

似乎dbms_job.submit不起作用。我創建了proc,我可以執行它。但是,如果我嘗試使用dbms_job.submit來執行該作業,則什麼都不會發生。它說這個塊已經完成,但是proc沒有被執行 – kralco626

+0

@ kralco626 - 你提交了嗎?該作業只能在您提交'dbms_job.submit'調用後才能運行。你的「JOB_QUEUE_PROCESSES」設置爲?如果設置爲0,則數據庫未配置爲允許後臺作業,因此您需要將其啓動。您是否在'DBA_JOBS'(或'USER_JOBS'或'ALL_JOBS'根據您的權限)中看到該作業? –