2012-10-14 108 views
1

我有一個程序,其中100個表必須逐一更新。所有表都有相同的列進行更新。爲了提高性能,我嘗試使用FORALL立即執行FORALL,但是我收到了很多編譯錯誤。立即執行FORALL語句

是否可以在句法上使用Execute immediate更新FORALL語句內的100個不同的表。

我的代碼看起來像這樣。

Declare 
    TYPE u IS TABLE OF VARCHAR2(240) INDEX BY BINARY_INTEGER; 
     Table_List u; 
FOR somecursor IN (SELECT variable1, variable2 FROM SomeTable) 
    LOOP 
     BEGIN 
      Table_List(1) := 'table1'; 
      Table_List(2) := 'table2'; 
      ...... 
      ...... 
      table_list(100):= 'table100'; 
     FORALL i IN Table_List.FIRST .. Table_List.LAST 
      EXECUTE IMMEDIATE 'UPDATE :1 SET column = :3 WHERE column = :2' 
      USING Table_List(i), somecursor.variable1, somecursor.variable2 ; 
    end loop; 

我希望人們能夠通過這段代碼瞭解我正在嘗試做什麼。如果有什麼大錯誤,請告訴我語法到底是什麼,以及是否可以用其他有效的方式完成。

非常感謝所有來我的方式的幫助。

回答

0

只是一個猜測,但我不認爲你可以使用綁定變量作爲表名。您是否嘗試過:

EXECUTE IMMEDIATE 'UPDATE ' || Table_List(i) || ' SET column = :2 WHERE column = :3' ... 
+0

我只是試過這個,但得到這麼多的編譯錯誤...任何建議? – Arunabh

1

(1)不,您不能使用表名的綁定變量。 (2)當您使用EXECUTE IMMEDIATE時,這意味着動態SQL - 但FORALL要求只有一個語句才能執行。只要你指定一個不同的表,你就是在談論一個不同的語句(不管表的結構是否等價)。你將不得不在普通的FOR循環中這樣做。

+0

但在普通for循環中執行此操作需要花費大量時間並導致會話等待問題。你能否建議其他方式用相同類型的查詢逐一更新100個表格。 – Arunabh

+0

是 - 展開循環,並有100個UPDATE語句。這是你將得到的最好的。性能問題背後的根本原因是,你試圖運行100 *不同的*更新語句。然後,你需要弄清爲什麼每個更新花費很長時間,並且單獨調整它們。 –