在PL/SQL中有異步調用的任何功能嗎? 假設我在一段代碼中想多次調用一個過程,並且在程序返回時什麼時候以及什麼都不打擾?我們可以在PL/SQL中使用線程嗎?
BEGIN
myProc(1,100);
myProc(101,200);
myProc(201,300);
...
...
END;
在上述情況下,我不希望我的代碼等待MYPROC(1100)執行(101,200)
由於之前完成處理。
在PL/SQL中有異步調用的任何功能嗎? 假設我在一段代碼中想多次調用一個過程,並且在程序返回時什麼時候以及什麼都不打擾?我們可以在PL/SQL中使用線程嗎?
BEGIN
myProc(1,100);
myProc(101,200);
myProc(201,300);
...
...
END;
在上述情況下,我不希望我的代碼等待MYPROC(1100)執行(101,200)
由於之前完成處理。
+1 DBMS_SCHEDULER和DBMS_JOB方法,還要考慮是否你應該使用不同的方法。
如果你有一個逐行執行的過程,並且你發現它很慢,那麼答案很可能不是同時多次運行該過程,而是爲了確保使用基於集合的aproach代替。在極端情況下,您甚至可以使用並行查詢和並行DML來減少進程的掛鐘時間。
我提到這只是因爲它是一個非常常見的故障。
你可能想看看DBMS_SCHEDULER。
編輯的完整性:
DMBS_SCHEDULER可在Oracle 10g上。對於此前的版本,DBMS_JOB執行大致相同的工作。
欲瞭解更多信息,請參見:http://download.oracle.com/docs/cd/B12037_01/server.101/b10739/jobtosched.htm
提交的DBMS_JOB像這樣:
declare
ln_dummy number;
begin
DBMS_JOB.SUBMIT(ln_dummy, 'begin myProc(1,100); end;');
DBMS_JOB.SUBMIT(ln_dummy, 'begin myProc(101,200); end;');
DBMS_JOB.SUBMIT(ln_dummy, 'begin myProc(201,300); end;');
COMMIT;
end;
你需要的JOB_QUEUE_PROCESSES參數設置爲> 0產卵線程來處理作業。您可以通過檢查視圖user_jobs來查詢作業。
請注意,這適用於Oracle 9i,不確定10g具有哪些支持。查看更多信息here。
編輯:添加錯過COMMIT
有關信息,DBMS_JOB在Oracle 10g中已由DBMS_SCHEDULER棄用。請參閱http://download.oracle.com/docs/cd/B12037_01/server.101/b10739/jobtosched.htm – 2009-02-23 12:19:30
這樣做的一個訣竅是,在作業實際開始運行之前,您需要執行COMMIT。我見過這個由幾個人錯過了。 – 2009-02-24 01:41:05
這裏解釋了將數據卸載到平面文件的不同方法。其中一種方式顯示瞭如何使用PL/SQL執行並行執行來加快速度。
做並行(多線程)的另一種方式PL/SQL如下所示:
http://www.williamrobertson.net/documents/parallel-plsql-launcher.html
使用DBMS_JOB或dbms_schedular的缺點是,你真的不知道當你的任務完成。我讀到你不打擾,但也許你將來會改變主意。
編輯:
本文http://www.devx.com/dbzone/10MinuteSolution/20902/0/page/1介紹了另一種方式。它使用dbms_job
和dbms_alert
。警報用於表示作業已完成(回調信號)。
您是否考慮過使用Oracle Advaned Queuing?
對於PL/SQL並行處理,你有以下幾種選擇:
這些都將讓你 「模仿」 分叉和PL線程/ SQL。當然,使用這些,您可能會意識到需要在並行執行的程序之間進行通信。這樣做的檢查:
我個人一直使用DBMS_SCHEDULER實現並行處理系統,以及用於DBMS_PIPE 「線程」 之間進行通信。我對這兩者的結合感到非常滿意,我的主要目標(通過特定的重量較輕的程序減少主要加工時間)已經實現!
askTom在這裏列出的並行流水線方法提供了一種更復雜的方法,但實際上會暫停直到工作完成,這與DBMS Job技術不同。也就是說,你確實要求「異步」技術,DBMS_JOB是完美的。
你在11g中有另一個選項。 Oracle引入了一個與您想要做的事情類似的軟件包,名稱爲DBMS_PARALLEL_EXECUTE
根據他們的說法,「DBMS_PARALLEL_EXECUTE包使用戶可以並行增量更新表數據」。如何使用它一個相當不錯的總結是here
基本上,你定義的方式(由你似乎被路過的一些鍵值,你的情況),甲骨文應該用它來打破你的工作成小塊,然後將其將單獨開始每件作品。爲了使用它,當然有一些小規劃和一些額外的編碼,但沒有什麼是你不應該做的。
使用這種認可方法的優點是Oracle甚至提供了可用於監視每個獨立線程的數據庫視圖。
一旦你讓實驗室的Parallel提示,每個Tom,Dick和Harry程序員都會把它放在每個查詢中,就好像它是一個參數。 vewy,vewy cawfule。 –
2009-02-23 15:58:35