2013-03-23 7 views
0

트리거 (pl/sql oracle 10g)를 사용하여 레코드를 다른 테이블 (MICL_SUPERVISORS)에 삽입/업데이트하려고합니다. 고유 제한 조건을 위반 : PL/SQL (INSERT/UPDATE) 고유 제약 조건 위반 오류 sequencel.nextval로 인한 트리거

트리거는

ORA-00001 같은 오류를주고있다 발사합니다.

은 내가

Select micl_sup_id_seq.nextval into nSUPID from dual 

순서

에서 SUPID을 추가 할 수 있기 때문에 그런 일이 알고 그리고 이것은 루프 내부에서 일어나고있다.

SUPID 열이 내 테이블 (MICL_SUPERVISOR)의 기본 키입니다. 그래서 나는 그 제약 조건을 떨어 뜨릴 수 없다.

일단 자동 증가를 시도했지만 오랜 시간이 걸리고 제대로 작동하지 않으며 속도가 느립니다. 이 테이블에는 수천 개의 레코드가 있습니다. 나는 그것을했다

SELECT MAX((SUP_ID)+1 from micl_sup_id_seq 

이 오류 때문에 나는 작은 연구를했고 우리는 방아쇠 안에 seq.nextval을 사용할 수 없다는 것을 발견했다. 그래서 제 질문은 이것을 달성하기위한 쉽고 정확한 방법이 있습니까? 여기

코드 불분명 아무것도 요구하는 경우에

CREATE OR REPLACE TRIGGER "c"."INSERT_MICL_SUP_DETAILS" 
AFTER INSERT OR UPDATE OF "ID","SUP_EMP_NO","EMP_NO" ON "MIMAX"."EMP" 
REFERENCING OLD AS "OLD" NEW AS "NEW" FOR EACH ROW 
DECLARE 
    miclaim_supervisor_count NUMBER; 
    employee_company_code VARCHAR2(10); 
    employee_businessunit NUMBER; 
    projmgr NUMBER; 
    nsupid 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 = '0345' AND s.div_code = '1010' 
    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; 

    projmgr := 0; 
    IF (employee_company_code ='SOFT')THEN 
    OPEN projmgrscursor; 
    LOOP 
     FETCH projmgrscursor INTO projmgr; 
     EXIT WHEN projmgrscursor%notfound; 

     SELECT micl_sup_id_seq.nextval INTO nsupid FROM dual; 

     INSERT INTO micl_supervisors (sup_id,assigned_date 
            , assigned_by_emp_no 
            , amount_limit 
            , is_ovverridden 
            , sup_emp_no 
            , rtd_emp 
            , emp_no) 
           VALUES (nsupid 
            , SYSDATE 
            , :NEW.entryaddedby_emp_no 
            , 3000 
            , 0 
            , projmgr 
            , NULL 
            , :NEW.emp_no); 

    END LOOP; 
    CLOSE projmgrscursor; 
    ELSE 
    IF(miclaim_supervisor_count IS NULL OR miclaim_supervisor_count<1) THEN 
     INSERT INTO micl_supervisors VALUES (:NEW.ID 
              , SYSDATE 
              , :NEW.entryaddedby_emp_no 
              , 3000 
              , 0 
              , :NEW.sup_emp_no 
              , NULL 
              , :NEW.emp_no); 
    END IF; 
    END IF; 
END; 
/

을 (절 다른 부분은 잘 작동되는 경우 내부 일어나는 모든. Pls는, 내가 커서를 사용한다는 점에 유의 열린 커서 안에이 모든 일이)입니다 나는이 시나리오에 대해 더 설명 할 것이고, 누구든지이 문제를 푸는데 도움이되기를 바랍니다.

+0

[루프 내부에서 트리거 할 nextval을 삽입하는 방법] 가능한 복제본 (http://stackoverflow.com/questions/15566087/how-to-insert-nextval-to-trigger-inside-for-loop). 같은 질문을 여러 번 게시하는 대신 원래 질문으로 돌아가 편집하십시오. –

+0

ORA-00001 : 고유 제약 조건 위반은 이미 micl_supervisors 테이블에있는 값을 삽입하려고 시도 할 때만 발생합니다. 따라서 다음을 확인해야합니다. NEW.ID is 또는 고유 한 제약 조건 열은 발생시키는 트리거 및 시퀀스 nsupid 값을 발생시킬 때 테이블의 값과 다릅니다. – ajmalmhd04

+0

"... 우리는 트리거 내에서 seq.nextval을 사용할 수 없습니다 ..."- 어디에서 읽었습니까? –

답변

1

테이블에 어떤 다른 제약 조건이 있습니까? 당신이 고정되어있는 다른 시퀀스에 제약 조건 오류가 발생할 가능성이 더 큽니다.

이 오류로 인해 작은 연구를 수행하여 트리거 내에서 seq.nextval을 사용할 수 없음을 알았습니다.

어디서 읽었는지 모르겠지만 그게 사실입니다. 많은 감사 트리거/테이블에 대해 seq.nextval을 사용했으며 정상적으로 작동합니다.

쿼리 all_constraints (또는 user_constraints) 테이블 이름 micl_supervisors에 - 그래서

SELECT * 
FROM user_constraints 
WHERE table_name = 'MICL_SUPERVISORS' 

과 질문을 업데이트하거나 삽입하려는 어떤 데이터를 확인있다.

+0

ur feedback에 대한 감사합니다. 나는 말했던 바를했지만 두 가지 더 많은 제약이 있습니다. 나는 코드 레벨에서 이것을 수행하려고하는이 트리거를 포기한다. :) 감사 힙 어쨌든 덕분에 많이 – cHaNkX