【问题标题】:Oracle 11g: ORA-00604 ORA-02429 when inserting record. Cannot insert in tableOracle 11g:插入记录时出现 ORA-00604 ORA-02429。无法插入表格
【发布时间】:2025-12-05 13:15:01
【问题描述】:

我使用以下脚本在我的 Oracle 11g 数据库中创建了一个新表。

CREATE TABLE TEST_TABLE
(
  test_number       NUMBER,
  test_name         VARCHAR2(100),
  test_system       NUMBER,
  isEnabled         CHAR(1),
  createdby         NUMBER,
  created           DATE,
  modifiedby        NUMBER,
  modified          DATE,
  comments          VARCHAR2(150),
  hasAgenda         CHAR(1),
  hasValue          CHAR(1),
  resumee           VARCHAR2(50),
  images            VARCHAR2(100),
  hasOptions        CHAR(1),
  isRecorded        CHAR(1),
  isSaved           CHAR(1),
  valueType         VARCHAR2(10)
);

然后,我尝试使用以下脚本插入记录:

INSERT INTO TEST_TABLE
    (test_number, test_name, test_system, isEnabled, createdby,
    created, modifiedby, modified, comments, hasAgenda,
    hasValue, resumee, images, hasOptions, isRecorded,
    isSaved, valueType)
VALUES(
    1, 'name', 2, 'Y', 3,
    SYSDATE, 4, SYSDATE, 'obs', 'Y',
    'Y', 'resumee', 'images', 'Y', 'Y',
    'N', 'value'
);

当我运行插入语句时,我收到此错误:

ORA-00604: error occurred at recursive SQL level 1
ORA-02429: cannot drop index used for enforcement of unique/primary key

当没有定义索引或约束时,我无法弄清楚为什么我会收到此错误。也没有与该表关联的触发器。

有什么建议吗?

提前致谢。

【问题讨论】:

  • 是否有系统级触发器?好像是这样。
  • 这张表中有哪些键和索引?
  • 这是一个全新的表,我还没有定义索引或约束,甚至没有PK。这就是为什么我认为这是一种非常奇怪的行为。

标签: sql oracle oracle11g dml


【解决方案1】:

错误ORA-00604 是一种常见错误,有时很难解决。处理递归 SQL 语句时发生 ORA-00604。

递归 SQL 语句是适用于内部字典表(或触发器中您自己的表)的语句。

所以应该有一种情况触发了对内部目录表的访问。

您应该首先检查可能影响您的现有 DDL 或系统触发器。

SELECT *
  FROM dba_triggers
 WHERE trigger_type NOT LIKE '% EACH ROW' AND trigger_type NOT LIKE 'INSTEAD OF';

其他原因可能是由于新行而编译的无效 PL/SQL。

由于错误的可能原因有很多,Oracle 只是指出堆栈中的下一个错误。

如果您可以访问您的服务器,则可以考虑跟踪您的会话:

ALTER SESSION SET SQL_TRACE=TRUE;

INSERT INTO TEST_TABLE
    (test_number, test_name, test_system, isEnabled, createdby,
    created, modifiedby, modified, comments, hasAgenda,
    hasValue, resumee, images, hasOptions, isRecorded,
    isSaved, valueType)
VALUES(
    1, 'name', 2, 'Y', 3,
    SYSDATE, 4, SYSDATE, 'obs', 'Y',
    'Y', 'resumee', 'images', 'Y', 'Y',
    'N', 'value'
);

ALTER SESSION SET SQL_TRACE=FALSE;

您可以使用以下名称识别您的诊断目录 $ORACLE_BASE/diag/rdbms///trace 下的跟踪文件:

SELECT LOWER(SYS_CONTEXT('userenv', 'instance_name')) || '_ora_' || p.spid || '.trc' AS trace_file
  FROM v$session s, v$process p
 WHERE s.paddr = p.addr AND s.audsid = SYS_CONTEXT('USERENV', 'SESSIONID');

看看那个文件,你可能会发现错误来自哪里。

【讨论】: