Oracle10g 甲骨文序列问题

Oracle10g 甲骨文序列问题,oracle10g,Oracle10g,我的触发器中有两个由更新触发的插入。我的Vendor_Hist表有一个名为thID的字段,它是Task_History表中的主键。thID从mySeq.nextval获取其值 INSERT INTO TASK_HISTORY ( thID, phId, LABOR, VERSION ) ( select mySeq.NEXTVAL, mySeq2.CurrVal, LABOR, tmpVersion from tasks t

我的触发器中有两个由更新触发的插入。我的Vendor_Hist表有一个名为thID的字段,它是Task_History表中的主键。thID从mySeq.nextval获取其值

INSERT INTO TASK_HISTORY
    ( thID, phId, LABOR, VERSION )         

    ( select   mySeq.NEXTVAL, mySeq2.CurrVal,  LABOR,  tmpVersion 
      from   tasks t     
      where t.project_id = :new.project_ID ); 

  select mySeq.currval into tmpTHID from dual; -- problem here! 

   INSERT INTO VENDOR_HIST 
    ( vhID, thID, Amount, Position, version  ) 

    ( select mySeq3.NEXTVAL,   tmpTHID,  
                Amount, Position, tmpVersion
      from   vendors v2, tasks t2     
      where  v2.myID =  t2.myID 
      and      t2.project_id = :new.project_ID );      
现在,我的问题是tmpTHID始终是mySeq.nextVal的最新值。所以,如果task_history中的thID是1,2,3,我会在vendor_hist表中插入三个3,3,3。它必须是1,2,3。我也试过了

  INSERT INTO TASK_HISTORY
    ( thID, phId, LABOR, VERSION )         

    ( select   mySeq.NEXTVAL, mySe2.CurrVal,  LABOR,  tmpVersion 
      from   tasks t     
      where t.project_id = :new.project_ID )  returning thID into :tmpTHID;
但是,当我执行触发器时,我会得到一个编译了错误消息的警告。如何确保第一次插入的thID与第二次插入的thID相同

希望它有意义

for i in (select * from tasks t
           where t.project_id = :new.project_id)
loop
  insert into task_history
  ( thID, phId, LABOR, VERSION )              
  values
  (mySeq.NEXTVAL, mySeq2.CurrVal,  i.LABOR,  i.tmpVersion);

  for each j in (select * from vendors v
                  where i.myId = v.myId)
  loop
    insert into vendor_history
    ( vhID, thID, Amount, Position, version  )         
    values    
    (mySeq3.NEXTVAL, mySeq.CURRVAL, j.Amount, j.Position, j.tmpVersion)
  end loop;
end loop;

我假设在第二次插入中插入的列来自供应商表;如果没有,则应根据需要使用参考光标i或j。

而不是currVal,它与以下子选择一起工作

   (  select min(thID) from task_history t3
       where t3.project_id = t2.project_id
       and t3.myID = t2.myID 
       and t3.version = tmpVersion ), 

危险危险你确定不能在那里获取其他人的数据吗?在并发加载的情况下,它会失败,因为一行可能会潜入任务历史。实际上,我不需要在这里输入min。我不明白你所说的并发负载情况是什么意思。主表已合并为语句,触发器在upd/del/ins上触发。此外,历史记录表具有fk pk关系。在不插入其他两个表的情况下,不能偷偷插入一行。它打破了fk关系。