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*
我无法弄清楚我出错的地方。请帮助我:(
请注意,我不能删除约束和主键
答
你肯定的是,在触发发生错误?它看起来对我来说,这可能是失败的INSERT是一个进入EMP_REPORT - 可能是因为EMP_REPORT中已经有一行ID ='71',如果您可以确认哪些表SYS_C0023329处于打开状态将会很有帮助
但是,假设消息是由触发器生成的 - I只在触发器中看到两个INSERT,都插入到SUP表中,所以问题必须来自其中一个INSERT。要么是
SUP中已经有一行,它有一个键值(你不会在你的INSERT语句中显示对应于SUP的列的名称,所以我不知道该字段的名字可能是什么)大于当前值MICL_SUP_ID_SEQ.NEXTVAL的值,或
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';
这会告诉你的约束是什么表。
分享和享受。
这不是编译错误,这是一个执行错误。这意味着表中已经有记录。唯一约束引用了什么表? ('SELECT table_name FROM all_constraints WHERE constraint_name ='SYS_C0023329'') – 2013-03-19 10:41:24
@VincentMalgrat嗨thankx很多为你的答案雅我知道这不是编译错误,但我不能改变任何约束,因为这是活的数据库我觉得我有问题里面for循环(逻辑)可以帮助我弄清楚它 – cHaNkX 2013-03-19 10:59:30