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

问题描述:

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它弹出一个错误味精说PLSQL触发错误ORA-0000 ORA-06512:

*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* 

我无法弄清楚我出错的地方。请帮助我:(

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

+0

这不是编译错误,这是一个执行错误。这意味着表中已经有记录。唯一约束引用了什么表? ('SELECT table_name FROM all_constraints WHERE constraint_name ='SYS_C0023329'') – 2013-03-19 10:41:24

+0

@VincentMalgrat嗨thankx很多为你的答案雅我知道这不是编译错误,但我不能改变任何约束,因为这是活的数据库我觉得我有问题里面for循环(逻辑)可以帮助我弄清楚它 – cHaNkX 2013-03-19 10:59:30

你肯定的是,在触发发生错误?它看起来对我来说,这可能是失败的INSERT是一个进入EMP_REPORT - 可能是因为EMP_REPORT中已经有一行ID ='71',如果您可以确认哪些表SYS_C0023329处于打开状态将会很有帮助

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

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

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

这第二个问题,从一个表(EMP_REPORT)作为第二个表(SUP)键值提供的关键价值似乎有点怀疑我了,我建议首先寻找在那里。我想你会想从MICL_SUP_ID_SEQ中得到一个在SUP表中使用的值。

要验证该问题是由一个INSERT INTO SUP造成的,您可以尝试执行以下操作:

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

这会告诉你的约束是什么表。

分享和享受。