2011-03-31 189 views
0
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中執行它。該錯誤在循環中僅出現'唯一'。它是否有時間問題?合併導致違反唯一約束

在此先感謝 問候 瑪格達

+0

請顯示觸發器用於創建DPR_ID – tbone 2011-03-31 11:24:08

回答

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的結果低,則序列是失步與表中的,需要加以修正。

+0

您好託尼,感謝您的回覆。 – 2011-03-31 13:06:51

+0

事實上,它是由於序列返回的錯誤(而非唯一)號碼。非常感謝你!! – 2011-03-31 13:34:46

+1

沒關係。如果你對此感到滿意,你可以「接受」我的答案。 – 2011-03-31 13:38:39