oracle - PL/SQL Append_Values 提示给出错误消息

标签 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;

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

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.

有谁知道如何使此代码工作,或者如何快速将大量行插入到另一个表中?

最佳答案

您收到此错误是因为您的每个 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  /

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

关于oracle - PL/SQL Append_Values 提示给出错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21791090/

相关文章:

java - 无法找到或加载 oracle.jdbc.driver.OracleDriver

oracle - VS Code Oracle Developer 在结果窗口中隐藏 SQL

oracle - 如何实现多维序列

oracle - 当存在唯一索引时,Oracle 10g 和 11g 之间的 REF CURSOR 行为有何不同?

plsql - 如何限制 PL/SQL 代码对输入参数执行两次相同的值?

sql - 在 Oracle SQL 中计算一年中的手动周数

oracle - 游标是否在内存中存储 SELECT 结果记录集?

oracle - Oracle的object_type JOB的dbms_metadata.get_ddl

sql - 甲骨文 00932.00000 - "inconsistent datatypes: expected %s got %s"