트리거 (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는, 내가 커서를 사용한다는 점에 유의 열린 커서 안에이 모든 일이)입니다 나는이 시나리오에 대해 더 설명 할 것이고, 누구든지이 문제를 푸는데 도움이되기를 바랍니다.
[루프 내부에서 트리거 할 nextval을 삽입하는 방법] 가능한 복제본 (http://stackoverflow.com/questions/15566087/how-to-insert-nextval-to-trigger-inside-for-loop). 같은 질문을 여러 번 게시하는 대신 원래 질문으로 돌아가 편집하십시오. –
ORA-00001 : 고유 제약 조건 위반은 이미 micl_supervisors 테이블에있는 값을 삽입하려고 시도 할 때만 발생합니다. 따라서 다음을 확인해야합니다. NEW.ID is 또는 고유 한 제약 조건 열은 발생시키는 트리거 및 시퀀스 nsupid 값을 발생시킬 때 테이블의 값과 다릅니다. – ajmalmhd04
"... 우리는 트리거 내에서 seq.nextval을 사용할 수 없습니다 ..."- 어디에서 읽었습니까? –