Oracle PL/SQL(INSERT/UPDATE)唯一约束违反触发器中的错误,原因是sequencel.nextval

Oracle PL/SQL(INSERT/UPDATE)唯一约束违反触发器中的错误,原因是sequencel.nextval,oracle,plsql,triggers,sequence,ora-00001,Oracle,Plsql,Triggers,Sequence,Ora 00001,我希望使用触发器pl/sql oracle 10g将记录插入/更新到另一个表MICL_SUPERVISORS 触发触发器时,它会给出一个错误 ORA-00001:违反了唯一约束 我知道这是因为我想从序列中添加SUPID Select micl_sup_id_seq.nextval into nSUPID from dual 这是在一个循环中发生的 SUPID列是我的表MICL_SUPERVISOR中的主键。所以我不能放弃这个限制 有一次我尝试了自动递增,但它需要很长时间,效果不好,而且速度

我希望使用触发器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。所以我的问题是,有没有简单、准确的方法来实现这一点

下面是代码,如果子句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;
/

如果有任何不清楚的地方,请询问我,我将进一步解释此场景,我希望任何人都能帮助解决此问题

还有哪些其他限制?更有可能的是,您遇到了一个与序列不同的约束错误,而您正专注于此

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

我不知道你从哪里读到的,但那绝对是假的。我已经在我的许多审计触发器/表中使用了seq.nextval,它运行良好

查询表名为micl\u supervisors的所有\u约束或用户\u约束,如

SELECT *
FROM   user_constraints
WHERE  table_name = 'MICL_SUPERVISORS' 

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

可能的副本。与其多次发布同一问题,不如返回并编辑原始问题。ORA-00001:只有在尝试插入表micl_中已有的值时,才会出现违反唯一约束的情况。因此,您应该检查:NEW.ID是否为或唯一约束列是否与触发触发器和生成的序列nsupid值时表中的值不同。。。。我们不能在触发器内使用seq.nextval…-你在哪里读到的?@davidAldridge嗨,我记得我在stackoverflow的某个地方读到的。我很抱歉我错了相信它:@ajmalmhd04我检查了一下,但没有用谢谢你的帮助谢谢你的反馈我按照你说的做了,但还有两个限制,但与此无关我放弃了这个触发器,想在代码级别做这件事:谢谢堆无论如何谢谢