2011-11-21 115 views
4

我正在使用Oracle 10gR2。在Oracle過程中實現多線程

這裏是我的問題 -

我有一個程序,讓叫它* proc_parent *(包內),這是應該調用其他程序,讓叫它* user_creation *。我必須在循環內部調用* user_creation *,該循環正在讀取表中的某些列 - 並將這些列值作爲參數傳遞給* user_creation *過程。

的代碼是這樣的:

FOR i IN (SELECT community_id, 
         password, 
         username 
       FROM  customer 
       WHERE community_id IS NOT NULL 
       AND  created_by = 'SRC_GLOB' 
      ) 
    LOOP 
     user_creation (i.community_id,i.password,i.username); 
    END LOOP; 

COMMIT; 

user_Creation程序調用Web服務的一些業務邏輯,然後根據該響應更新的表。

我需要找到一種方法,我可以在這裏使用多線程,這樣我就可以運行此過程的多個實例來加快速度。我知道我可以使用* DBMS_SCHEDULER *和可能* DBMS_ALERT *但我無法弄清楚,如何在循環內使用它們。

有人可以引導我在正確的方向嗎?

感謝, ANKUR

回答

1

我想關閉這個問題。 DBMS_SCHEDULER以及DBMS_JOB(儘管DBMS_SCHEDULER是首選)可以在循環內用於提交和執行作業。

例如,這裏是一個示例代碼,用DBMS_JOB其可以在一個循環內被調用:

... 
FOR i IN (SELECT community_id, 
       password, 
       username 
      FROM customer 
      WHERE community_id IS NOT NULL 
      AND created_by = 'SRC_GLOB' 
     ) 
LOOP 
DBMS_JOB.SUBMIT(JOB => jobnum, 
       WHAT => 'BEGIN user_creation (i.community_id,i.password,i.username); END;'  
COMMIT; 
END LOOP; 

使用提交SUBMIT之後將揭開在平行作業(並且因此過程)。

3

你可以做的是在同一時間提交大量的就業機會。請參閱Example 28-2 Creating a Set of Lightweight Jobs in a Single Transaction

這樣就可以在同一時間填寫您想在一個tx中提交的所有作業的pl/sql表。只要它們被提交(啓用),它們就會開始運行,系統可以處理的數量或資源管理器計劃允許的數量。

輕量級作業的開銷非常小......輕。