2011-03-31 4 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

답변

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

안녕하세요 tony를 만드는 데 사용 된 트리거를 표시하십시오. –

+0

실제로 순서 (sequence)에 의해 반환 된 잘못된 (고유하지 않은) 숫자 때문이었습니다. 대단히 감사합니다 !! –

+1

괜찮습니다. 만약 당신이 행복하다면 당신은 내 대답을 받아 들일 수 있습니다. –

관련 문제