Plsql 如何插入nextval以在for循环内部触发

Plsql 如何插入nextval以在for循环内部触发,plsql,unique-constraint,nextval,database-trigger,Plsql,Unique Constraint,Nextval,Database Trigger,这是触发器的代码,它有一个for循环。当触发INSERT或UPDATE时,必须包含另一个表数据,即MICL\U SUP OPEN projMgrsCursor; LOOP FETCH projMgrsCursor INTO projMgr; select micl_sup_id_seq.nextval into SUPID from dual; insert into MICL_SUP VALUES ((SUPID), (

这是触发器的代码,它有一个for循环。当触发INSERT或UPDATE时,必须包含另一个表数据,即MICL\U SUP

 OPEN  projMgrsCursor;
        LOOP
        FETCH projMgrsCursor INTO projMgr;  
        select micl_sup_id_seq.nextval into  SUPID from dual;
        insert into MICL_SUP VALUES ((SUPID), (SELECT SYSDATE FROM DUAL),                             :NEW.ENTRYADDEDBY_EMP_NO, 3000, 0,projMgr, NULL,:NEW.EMP_NO);
       END LOOP;    

      CLOSE projMgrsCursor;
这是表结构。Sup_ID主键和唯一键。我无法对表结构进行任何更改

SUP_ID  -primary key             
ASSIGNED_DATE            
ASSIGNED_BY_EMP_NO          
AMOUNT_LIMIT            
IS_OVVERRIDDEN      
SUP_EMP_NO          
RTD_EMP     
EMP_NO  
要输入sup_ID,我使用选择micl_sup_ID_seq.nextval从dual输入SUPID; 但当我运行这段代码时,出现了一个错误RA-00001:违反了唯一约束这不是编译错误有没有其他方法添加sup_ID?我哪里出错了


此问题与此触发器相关

为什么不将micl\u sup\u id\u seq.nextval的计算包含在光标中

cursor  projMgrsCursor is 
  select b.BU_MEMBER_ID, micl_sup_id_seq.nextval SUPID
  from ...

尝试将代码改写为:

DECLARE
  nSupid   NUMBER;
  projMgr  VARCHAR2(32767);
BEGIN
  OPEN  projMgrsCursor;

  LOOP
    FETCH projMgrsCursor INTO projMgr;
    EXIT WHEN projMgrsCursor%NOTFOUND;

    select micl_sup_id_seq.nextval into nSUPID from dual;

    insert into MICL_SUP 
      (SUPID, ASSIGNED_DATE, ASSIGNED_BY_EMP_NO,   AMOUNT_LIMIT,
       IS_OVERRIDDEN, 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;

  DBMS_OUTPUT.PUT_LINE('Successful completion');
EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('Exception: ' || SQLCODE || '  ' || SQLERRM);
    RAISE;
END;

共享和享受。

您只需在MICL\U SUP VALUES MICL\U SUP\U id_seq中插入一个值即可。下一步,从DUAL中选择SYSDATE。。。在循环本身中。不需要单独的变量。不存在编译错误PL/SQL:SQL语句被忽略PL/SQL:ORA-00933:SQL命令未正确执行是否确定表中没有其他唯一字段?@Sebas yep一些唯一的外键序列是如何创建的?如果它是在部分填充表之后创建的,那么它的起始值是否设置为高于表中任何现有值,还是默认为1?MICL_SUP表上有触发器吗?也同意不需要将序列值放入单独的变量中,除非需要多次使用它,所以。。。值micl_sup_id_seq.nextval,SYSDATE。。。会更干净-也不需要从dual.OK中选择sysdate-我在代码末尾添加了一个DBMS_OUTPUT.PUT_行以指示成功完成,并添加了一个异常处理程序块以报告是否引发了任何异常。尝试将这些添加到您的代码中,然后查看打印出的内容。