在FORALL语句中执行立即执行

时间:2012-10-14 19:10:10

标签: oracle

我有一个程序,其中100个表必须逐个更新。所有表都有相同的列要更新。为了提高性能,我试图使用FORALL的Execute Immediate,但是我收到了很多编译错误。

在语法上是否可以使用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;

我希望人们可以通过此代码了解我想要做的事情。如果出现问题,请告诉我究竟什么是语法,以及是否可以通过其他有效方式完成。

非常感谢所有帮助。

2 个答案:

答案 0 :(得分:1)

(1)不,你不能对表名使用绑定变量。

(2)当您使用EXECUTE IMMEDIATE时,这意味着动态SQL - 但FORALL要求只执行一个语句。一旦指定了另一个表,就会谈论一个不同的语句(无论表的结构是否恰好相同)。

您将不得不在普通的FOR循环中执行此操作。

答案 1 :(得分:0)

只是一个猜测,但我认为你不能使用绑定变量作为表名。你试过了吗?

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