Oracle10g 甲骨文序列问题
我的触发器中有两个由更新触发的插入。我的Vendor_Hist表有一个名为thID的字段,它是Task_History表中的主键。thID从mySeq.nextval获取其值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
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关系。