2012-10-14 110 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 *不同的*更新语句。然后,你需要弄清为什么每个更新花费很长时间,并且单独调整它们。 –