PL/SQL Append_Values Hint给出错误消息

use*_*037 5 oracle plsql ora-06512

我无法使用PL/SQL在Oracle表中执行大量插入操作.我的查询逐行进行,对于每一行,查询进行计算以确定需要插入另一个表的行数.传统的插入工作,但代码需要很长时间才能运行大量的行.为了加快插入速度,我尝试使用Append_Values提示,如下例所示:

BEGIN
FOR iter in 1..100 LOOP
INSERT /*+ APPEND_VALUES*/ INTO test_append_value_hint values (iter);
END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)

执行此操作时,我收到以下错误消息:

ORA-12838: cannot read/modify an object after modifying it in parallel
ORA-06512: at line 3
12838. 00000 -  "cannot read/modify an object after modifying it in parallel"
*Cause:    Within the same transaction, an attempt was made to add read or
           modification statements on a table after it had been modified in parallel
           or with direct load. This is not permitted.
*Action:   Rewrite the transaction, or break it up into two transactions
           one containing the initial modification and the second containing the
           parallel modification operation.
Run Code Online (Sandbox Code Playgroud)

有没有人知道如何使这个代码工作,或如何快速插入大量的行到另一个表?

Dmi*_*rov 4

您会收到此错误,因为您的每个 INSERT 都作为单独的 DML 语句执行。Oracle 会阻止对使用直接路径插入添加数据的表进行读/写,直至提交。从技术上讲,您可以使用 PL/SQL 集合和 FORALL 来代替:

SQL> declare
  2   type array_t is table of number index by pls_integer;
  3   a_t array_t;
  4  begin
  5    for i in 1..100 loop
  6      a_t(i) := i;
  7    end loop;
  8    forall i in 1..100
  9      insert /*+ append_values */ into t values (a_t(i));
 10  end;
 11  /
Run Code Online (Sandbox Code Playgroud)

但贾斯汀提出的问题是实际的 - 你的数据来自哪里,为什么不能使用通常的 INSERT /*+ append */ INTO ... SELECT FROM 方法?