合并导致违反唯一约束

时间:2011-03-31 10:13:38

标签: perl oracle

MERGE INTO dpr d
USING (select 3333 dpr_qot_id, to_date('1-Jun-07', 'DD-MON-RR') dpr_ts
from dual) s
on (s.dpr_ts = d.dpr_ts and s.dpr_qot_id = d.dpr_qot_id)
when not matched then
insert
(DPR_TS,
DPR_OPEN,
DPR_HIGH,
DPR_LOW,
DPR_CLOSE,
DPR_VOLUME,
DPR_QOT_ID)
values
(to_date('1-Jun-07', 'DD-MON-RR'),
920,
941.5,
915,
933.5,
696218,
3333)
WHEN MATCHED THEN
UPDATE
set DPR_OPEN = 920,
DPR_HIGH = 941.5,
DPR_LOW = 915,
DPR_CLOSE = 933.5,
DPR_VOLUME = 696218;

我有一个类似查询的循环(不同的日期,价格)。无论如何我有时会收到错误:违反了唯一约束(QF.IDX_DPR_ID)(DBD错误:OCIStmtExecute)。 唯一约束是在DPR_ID上定义的,它由触发器生成。 任何线索如何解决这个问题?循环用perl编写。我期望,使用合并时不会出现这种错误,不知道我做错了什么。 我可以在pl / sql中执行它。错误在循环中'仅'发生。这是时间问题吗?

提前谢谢 问候 玛格达

1 个答案:

答案 0 :(得分:3)

我的第一个想法是,序列当前可能返回的值低于表中DPR_ID的最大值。运行这些查询以查看:

1) select last_number from user_sequences 
   where sequence_name = '<name of sequence>';

2) select max(dpr_id) from dpr

如果查询1的结果低于查询2的结果,那么序列与表格不一致,需要修改。