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
Magda Muskala 31 Мар 2011 в 14:13
Пожалуйста, покажите триггер, используемый для создания DPR_ID
 – 
tbone
31 Мар 2011 в 15:24

1 ответ

Моей первой мыслью было бы, что, возможно, последовательность в настоящее время возвращает значения ниже, чем максимальное значение DPR_ID в таблице. Запустите эти запросы, чтобы увидеть:

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

2) select max(dpr_id) from dpr

Если результат запроса 1 ниже, чем результат запроса 2, то последовательность не соответствует таблице и ее необходимо изменить.

3
Tony Andrews 31 Мар 2011 в 14:52
На самом деле это было из-за неправильного (не уникального) числа, возвращаемого последовательностью. большое спасибо!!
 – 
Magda Muskala
31 Мар 2011 в 17:34
1
Это нормально. Вы можете «принять» мой ответ, если он вас устраивает.
 – 
Tony Andrews
31 Мар 2011 в 17:38