1
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;

このトリガーを1週間前に作成しましたが、コンパイルエラーはありませんでしたが、レコードを入力すると、次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* 

どこが間違っていたのかわかりません。plsは私を助けます:(

plsは、制約とその主キーを削除できないことに注意してください

4

1 に答える 1

3

トリガーでエラーが発生しますか? 失敗する可能性のある INSERT は EMP_REPORT にあるように見えます-おそらく EMP_REPORT に ID = '71' の行が既にあるためです。SYS_C0023329がどのテーブルにあるか確認していただけると助かります。

ただし、メッセージがトリガーによって生成されていると仮定すると、トリガーには 2 つの INSERT しか表示されず、どちらも SUP テーブルに挿入されているため、問題はこれらの INSERT のいずれかから発生している必要があります。また

  1. MICL_SUP_ID_SEQ.NEXTVAL の現在の値よりも大きいキー値を持つ SUP の行が既に存在します (SUP に対する INSERT ステートメントの列の名前を表示しないため、フィールドの名前が何であるかはわかりません)。 、 また

  2. SUP には、2 番目の INSERT で指定した新しい EMP_REPORT.ID フィールドと同じキー値を持つ行があります。

この 2 番目の問題は、1 つのテーブル (EMP_REPORT) のキー値を 2 番目のテーブル (SUP) のキー値として提供することです。MICL_SUP_ID_SEQ から値を取得して、SUP テーブルで使用することをお勧めします。

問題の原因が SUP への挿入であることを確認するには、次のコマンドを実行してみてください。

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

これにより、制約が存在するテーブルがわかります。

共有してお楽しみください。

于 2013-03-19T11:34:20.083 に答える