PlSQL 触发错误 ORA-0000 ORA-06512:

Posted

技术标签:

【中文标题】PlSQL 触发错误 ORA-0000 ORA-06512:【英文标题】:PlSQL trigger error ORA-0000 ORA-06512: 【发布时间】:2013-03-19 10:11:43 【问题描述】:
create or replace 
TRIGGER "SUP" AFTER INSERT ON "EMP_REPORT" REFERENCING OLD AS "OLD" NEW AS "NEW" FOR EACH ROW
DECLARE

  miclaim_supervisor_count number;
  employee_company_code VARCHAR2(10);
  employee_businessunit number;
  projMgrs NUMBER;
  supId NUMBER;

  cursor  projMgrsCursor is select b.BU_MEMBER_ID
  from BU_MEMBER b, EMP_SUB_DIV s
  where s.EMP_NO = :NEW.EMP_NO
  and s.SUB_DIVISION_CODE = '01' and s.DIV_CODE = '2'
  and b.BU_ID IN (select BU_ID from BU_MEMBER where BU_MEMBER_ID = :NEW.EMP_NO);


BEGIN
        delete from MICL_SUPERVISORS where EMP_NO = :NEW.EMP_NO and IS_OVVERRIDDEN = 0;
        select count(*) into miclaim_supervisor_count from MICL_SUPERVISORS where EMP_NO = :NEW.EMP_NO and IS_OVVERRIDDEN = 1;
        select COMPANY_CODE into employee_company_code from  EMPLOYEE_MASTER where EMP_NO = :NEW.EMP_NO;


    projMgrs := 0;

if (employee_company_code ='F')then 

  OPEN  projMgrsCursor;
    LOOP

     select micl_sup_id_seq.nextval into  supId from dual;
    FETCH projMgrsCursor INTO projMgrs;
    EXIT WHEN projMgrsCursor%NOTFOUND;

    insert into SUP VALUES ((supId), (SELECT SYSDATE FROM DUAL), :NEW.ENTRYADDEDBY_EMP_NO, 3000, 0,projMgrs, NULL,:NEW.EMP_NO);
    END LOOP;   

  CLOSE projMgrsCursor;
else
    if(miclaim_supervisor_count IS NULL or miclaim_supervisor_count<1) then
    insert into SUP VALUES ((:NEW.ID), (SELECT SYSDATE FROM DUAL), :NEW.ENTRYADDEDBY_EMP_NO, 3000, 0, :NEW.SUP_EMP_NO, NULL,:NEW.EMP_NO);
    end if;
end if;

END;

我一周前创建了这个触发器,但没有编译错误 但是当我向EMP_REPORT 输入一条记录时,它会弹出一条错误消息,说

 *INSERT INTO"EMP_REPORT" (ID, ADDEDDATE, ENTRYADDEDBY_EMP_NO, SUP_EMP_NO, EMP_NO) VALUES ('71', TO_TIMESTAMP('19-MAR-13 09.55.57.983000000 AM', 'DD-MON-RR HH.MI.SS.FF AM'), '81', '841', '5295')
ORA-00001: unique constraint (SYS_C0023329) violated
ORA-06512: at line 1

One error saving changes to table  "EMP_REPORT":
Row 51: ORA-00001: unique constraint (SYS_C0023329) violated
ORA-06512: at line 1* 

我不知道我哪里出错了。请帮助我:(

请注意我不能删除约束和它的主键

【问题讨论】:

这不是编译错误,这是执行错误。这意味着表中已经有一条记录。唯一约束引用什么表? (SELECT table_name FROM all_constraints WHERE constraint_name = 'SYS_C0023329') @VincentMalgrat 嗨,非常感谢您的回答,我知道这不是编译错误,但我无法更改任何约束,因为这是实时数据库我觉得我在 for 循环(逻辑)中有问题可以请帮我弄清楚 【参考方案1】:

您确定错误发生在触发器中吗?在我看来,可能失败的 INSERT 是 EMP_REPORT 中的那个 - 可能是因为 EMP_REPORT 中已经有一行 ID = '71'。如果您能确认 SYS_C0023329 位于哪个表上,将会很有帮助。

但是,假设消息是由触发器生成的 - 我在触发器中只看到两个 INSERT,都插入到 SUP 表中,所以问题一定来自这些 INSERT 之一。要么

    SUP 中已经有一行具有一个键值(您没有在针对 SUP 的 INSERT 语句中显示列的名称,所以我不知道该字段的名称可能是什么)大于MICL_SUP_ID_SEQ.NEXTVAL 的当前值,或

    SUP 中有一行的键值等于您在第二个 INSERT 中提供的新 EMP_REPORT.ID 字段。

第二个问题,从一个表 (EMP_REPORT) 提供一个键值作为第二个表 (SUP) 的键值对我来说似乎有点可疑,我建议先看看那里。我认为您希望从 MICL_SUP_ID_SEQ 中获取一个值以在 SUP 表中使用。

要验证问题是由插入 SUP 引起的,您可以尝试执行以下操作:

SELECT *
  FROM ALL_CONSTRAINTS c
  WHERE c.CONSTRAINT_NAME = 'SYS_C0023329';

这会告诉你约束在哪个表上。

分享和享受。

【讨论】:

以上是关于PlSQL 触发错误 ORA-0000 ORA-06512:的主要内容,如果未能解决你的问题,请参考以下文章

plsql 触发错误 ORA-00604

For循环中触发失败

PLSQL 触发器:插入前

PLSQL:触发器的语法问题

检索新值时触发器在 PLSQL 中不起作用

PLSQL触发器