我希望使用Trigger(pl / sql oracle 10g)将插入/更新记录到另一个表(MICL_SUPERVISORS)。
当触发器触发时,它会发出错误
ORA-00001:违反了唯一约束。
我知道这是因为我想从序列中添加SUPID
Select micl_sup_id_seq.nextval into nSUPID from dual
这发生在一个循环中。
SUPID列是我表中的主键(MICL_SUPERVISOR)。所以我不能放弃这个限制。
一旦我尝试自动递增但是它需要很长时间而且效果不好而且速度很慢。我在这张表中有数千条记录。我这样做了
SELECT MAX((SUP_ID)+1 from micl_sup_id_seq
由于这个错误,我做了一个小研究,发现我们不能在触发器中使用seq.nextval。所以我的问题是有没有简单,准确的方法来实现这一目标?
这是代码(它全部发生在 if子句其他部分工作正常。请注意我使用了游标,在开放游标内部这一切都发生了)
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;
/
如果有什么不清楚问我,我会进一步解释这个场景,我希望有人会帮助解决这个问题
答案 0 :(得分:1)
桌子上还有哪些其他限制?你更有可能遇到一个约束错误而不是你所关注的序列。
由于这个错误,我做了一个小研究,发现我们不能在触发器中使用seq.nextval。
我不知道你在哪里阅读,但这绝对是假的。我已经在我的许多审计触发器/表中使用了seq.nextval,它运行正常。
使用表格all_constraints
查询user_constraints
(或micl_supervisors
) - 就像这样
SELECT *
FROM user_constraints
WHERE table_name = 'MICL_SUPERVISORS'
并更新问题或检查您要插入的数据。