Oracle 在FORALL语句中立即执行
我有一个程序,其中100个表必须逐个更新。所有表都有相同的列要更新。为了提高性能,我尝试将executeimmediate与FORALL一起使用,但是我得到了很多编译错误 在语法上是否可以使用executeimmediate更新FORALL语句中的100个不同表 我的代码看起来像这样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 (
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语句。然后你需要弄清楚为什么每个更新都要花这么长时间,并对它们分别进行调整。我刚刚尝试了这个,但是得到了这么多编译错误…有什么建议吗?我刚刚尝试了这个,但是得到了这么多编译错误…有什么建议吗?