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*
我无法弄清楚我哪里出错了。请帮助我:(
请注意,我无法删除约束及其主键
答案 0 :(得分:3)
您确定触发器中发生了错误吗?在我看来,可能失败的INSERT是进入EMP_REPORT的那个 - 可能是因为在EMP_REPORT中已经有一行ID ='71'。如果您可以确认SYS_C0023329所在的表格,将会很有帮助。
但是,假设消息是由触发器生成的 - 我只在触发器中看到两个INSERT,都插入到SUP表中,因此问题必须来自其中一个INSERT。任
在SUP中已经有一行有一个键值(你没有在你的INSERT语句中显示SUP的列名,所以我不知道该字段的名称可能是什么)大于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';
这将告诉您约束所在的表格。
分享并享受。