Oracle 在FORALL语句中立即执行

Oracle 在FORALL语句中立即执行,oracle,Oracle,我有一个程序,其中100个表必须逐个更新。所有表都有相同的列要更新。为了提高性能,我尝试将executeimmediate与FORALL一起使用,但是我得到了很多编译错误 在语法上是否可以使用executeimmediate更新FORALL语句中的100个不同表 我的代码看起来像这样 Declare TYPE u IS TABLE OF VARCHAR2(240) INDEX BY BINARY_INTEGER; Table_List u; FOR somecursor IN (

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

在语法上是否可以使用executeimmediate更新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;
我希望人们能理解我试图通过这段代码做什么。如果有什么大错误,请告诉我确切的语法是什么,如果它可以在其他一些有效的方式也做


非常感谢您对我的帮助。

只是猜测一下,但我认为您不能使用绑定变量作为表名。您是否尝试过:

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

只是猜测一下,但我认为不能使用绑定变量作为表名。您是否尝试过:

EXECUTE IMMEDIATE 'UPDATE ' || Table_List(i) || ' SET column = :2 WHERE column = :3' ...
(1) 不,不能对表名使用绑定变量

(2) 当您使用EXECUTE IMMEDIATE时,这意味着动态SQL—但FORALL只需要执行一条语句。一旦您指定了一个不同的表,您就在谈论一个不同的语句(不管这些表的结构是否恰好相等)

您必须在普通FOR循环中执行此操作。

(1)不,不能将绑定变量用于表名

(2) 当您使用EXECUTE IMMEDIATE时,这意味着动态SQL—但FORALL只需要执行一条语句。一旦您指定了一个不同的表,您就在谈论一个不同的语句(不管这些表的结构是否恰好相等)


您必须在普通FOR循环中执行此操作。

但在普通FOR循环中执行此操作需要大量时间,并会导致会话等待问题。您是否可以建议其他方法,使用相同类型的查询逐个更新100个表。是-展开循环,并有100个更新语句。这是你能得到的最好的了。性能问题背后的基本原因是您试图运行100个不同的update语句。然后你需要弄清楚为什么每次更新都要花这么长时间,并对它们进行单独的调整。但是在普通的for循环中这样做需要很多时间,并且会导致会话等待问题。您是否可以建议其他方法,使用相同类型的查询逐个更新100个表。是-展开循环,并有100个更新语句。这是你能得到的最好的了。性能问题背后的基本原因是您试图运行100个不同的update语句。然后你需要弄清楚为什么每个更新都要花这么长时间,并对它们分别进行调整。我刚刚尝试了这个,但是得到了这么多编译错误…有什么建议吗?我刚刚尝试了这个,但是得到了这么多编译错误…有什么建议吗?