2015-08-13 174 views
0

我正在循環查看錶的列表並更新每個表中的列的列表。是否可以並行執行循環,即一次更新多個表。並行執行Oracle For循環

FOR Table_rec IN Table_list_cur 
    LOOP 
    --Check if the table is partitioned 
    IF Check_if_partitioned (Table_rec.Table_name, Table_rec.Owner) 
    THEN 
     --If Yes, loop through each parition 
     EXECUTE IMMEDIATE 
       'Select partition_name from USER_TAB_PARTITIONS where table_name = ''' 
      || Table_rec.Table_name 
      || ''' and owner = ''' 
      || Table_rec.Owner 
      || '''' 
      BULK COLLECT INTO L_part; 

     FOR I IN L_part.FIRST .. L_part.LAST 
     LOOP 
      --Update each parition 
      DBMS_OUTPUT.Put_line ('V_sql_stmt' || V_sql_stmt); 
      V_sql_stmt := 
       'UPDATE /*+ PARALLEL(upd_tbl,4) */ ' 
       || Table_rec.Table_name 
       || ' PARTITION (' 
       || L_part (I) 
       || ') upd_tbl' 
       || ' SET ' 
       || V_sql_stmt_col_list; 
      DBMS_OUTPUT.Put_line ('V_sql_stmt' || V_sql_stmt); 

      EXECUTE IMMEDIATE V_sql_stmt; 
     END IF; 
     END LOOP; 
    END LOOP; 
+0

在一個不相關的說明 - 不要忘記'alter session enable parallel dml;'當並行性工作時,您還需要在DML之間進行提交。我建議用簡單的11gR2語法替換'/ * + PARALLEL(upd_tbl,4)* /' - '/ * + PARALLEL(4)* /'。 –

回答

4

不直接,沒有。

你可以把循環的內容放到存儲過程調用中,然後提交一系列作業來完成異步運行的實際處理。使用dbms_job包,以便作業提交是交易的一部分,這將是這個樣子

CREATE OR REPLACE PROCEDURE do_update(p_owner  IN VARCHAR2, 
             p_table_name IN VARCHAR2) 
AS 
BEGIN 
    <<your dynamic SQL>> 
END; 

,然後運行循環來提交作業

FOR Table_rec IN Table_list_cur 
LOOP 
    --Check if the table is partitioned 
    IF Check_if_partitioned (Table_rec.Table_name, Table_rec.Owner) 
    THEN 
    dbms_job.submit(l_jobno, 
         'begin do_update(''' || table_rec.owner || ''', ''' || table_rec.table_name || '''); end;'); 
    END IF; 
END LOOP;       
commit; 

一旦commit運行,個別表格作業將開始運行(有多少個將由job_queue_processes參數控制),而其餘的則排隊。

現在,說,你的方法似乎有點關閉。首先,明確指定分區名稱幾乎是沒有用的。您幾乎可以肯定地要提交一個UPDATE語句,省略分區名稱,並讓Oracle並行地對各個分區執行更新。每個分區運行一條更新語句相反會影響分區的目的。如果你真的想爲每個分區使用4個並行線程,你可能不希望許多這些更新並行運行。並行性的要點是可以允許一條語句佔用系統資源的很大一部分。如果你真的想要,說16個分區級更新同時運行,並且每個更新需要運行4個從機,讓Oracle運行64個從機進行單個更新(或者你真正想要的任意數量的從機)會更有意義根據您想要離開系統所需的其他資源來執行此特定任務)。

+0

謝謝,這真的很有幫助。 –