oracle 11g:ora-00604 ora-02429无法在表中插入

omqzjyyz  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(294)

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

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'
);

运行insert语句时,收到以下错误:

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

当没有定义索引或约束时,我不明白为什么会收到这个错误。也没有与表关联的触发器。
有什么建议吗?
提前谢谢。

whhtz7ly

whhtz7ly1#

错误 ORA-00604 是一个常见的错误,有时很难解决。ora-00604在处理递归sql语句时发生。
递归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;

您可以在diag目录$oracle\u base/diag/rdbms/<db\u name>/<instace\u name>/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');

看看那个文件,你可能会发现错误的来源。

相关问题