Ошибка триггера 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 это выскакивает сообщение об ошибке MSG

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

Я не могу понять, где я ошибся. Пожалуйста, помогите мне:(

Пожалуйста, обратите внимание, что я не могу удалить ограничение и его первичный ключ

1 ответ

Решение

Вы уверены, что ошибка происходит в триггере? Мне кажется, что INSERT, который может быть неудачным, - это тот, что в EMP_REPORT - возможно, потому что в EMP_REPORT уже есть строка с ID = '71'. Было бы полезно, если бы вы могли подтвердить, какая таблица SYS_C0023329 включена.

Однако, предполагая, что сообщение генерируется триггером - я вижу только два INSERT в вашем триггере, оба вставляются в таблицу SUP, поэтому проблема должна исходить от одного из этих INSERT. Или

  1. В SUP уже есть строка, которая имеет значение ключа (вы не показываете имена столбцов в ваших инструкциях INSERT для SUP, поэтому я не знаю, как может быть имя поля) больше, чем текущее значение MICL_SUP_ID_SEQ.NEXTVAL, или же

  2. В SUP есть строка со значением ключа, равным новому полю EMP_REPORT. ID, которое вы указали во втором INSERT.

Эта вторая проблема, когда вводится значение ключа из одной таблицы (EMP_REPORT) в качестве значения ключа для второй таблицы (SUP), кажется мне несколько подозрительной, и я бы посоветовал сначала посмотреть на нее. Я думаю, вы захотите получить значение из MICL_SUP_ID_SEQ для использования в таблице SUP.

Чтобы убедиться, что проблема вызвана вставкой в ​​SUP, вы можете попробовать выполнить следующее:

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

Это скажет вам, на какой таблице находится ограничение.

Поделитесь и наслаждайтесь.

Другие вопросы по тегам