0

我想使用触发器(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 子句else 部分工作正常。请注意我使用了游标,在打开游标内这一切都发生了)

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

如果有什么不清楚的地方问我,我会进一步解释这个场景,我希望有人能帮助解决这个问题

4

1 回答 1

1

表上还有哪些其他约束?您更有可能遇到您所关注的序列以外的约束错误。

由于这个错误,我做了一个小的研究,发现我们不能在触发器中使用 seq.nextval。

我不知道你在哪里读到的,但这绝对是错误的。我已经为我的许多审计触发器/表使用了 seq.nextval,它工作正常。

使用表名查询all_constraints(或) - 像这样user_constraintsmicl_supervisors

SELECT *
FROM   user_constraints
WHERE  table_name = 'MICL_SUPERVISORS' 

并更新问题或检查您要插入的数据。

于 2013-03-26T14:12:46.453 回答