문서유형ㅣ장애해결
분야ㅣ모니터링/점검
적용제품버전ㅣ7FS02PS, 6FS07_CS_2005
문서번호ㅣTMOTS033
Merge 문 수행시 TBR-10021, JDBC-10021 오류 발생하게 될시 해결방안에 대해 기술한 문서입니다.
현상
배치 Job 수행 시 불규칙적으로 정상 수행되거나 다음 오류가 발생합니다.
JDBC-10021:Inconsistent set of rows in source tables.
$>tberr 10021
/*
* err: -10021
* name: ERROR_EXEC_INCONSISTENT_ROW_SET
* desc: Inconsistent set of rows in source tables.
* cause: Inconsistent DML result due to a non-deterministic WHERE condition.
* action: Modify the non-deterministic WHERE condition.;
*/
오류 재현
테이블 생성
CREATE TABLE test_tbl1 (
code varchar(10),
name varchar(40)
);
CREATE TABLE test_tbl2 (
code varchar(10)
);
샘플데이터 추가
insert into test_tbl1 values('TEST', 'tbl1_New');
insert into test_tbl2 values('TEST');
commit;
merge 쿼리 수행
MERGE INTO test_tbl1 a USING (select code from test_tbl2) b
ON (a.code=b.code)
WHEN MATCHED THEN
UPDATE SET a.name = 'tbl1_updated'
WHEN NOT MATCHED THEN
INSERT (a.code, a.name) VALUES ('TEST2','tbl1_inserted');
1 row merged.
merge 쿼리 정상 수행 확인
오류유발
ERROR_EXEC_INCONSISTENT_ROW_SET 오류 유발을 위해 중복된 디코드값 삽입
insert into test_tbl2 values('TEST');
commit;MERGE INTO test_tbl1 a USING (select code from test_tbl2) b
ON (a.code=b.code)
WHEN MATCHED THEN
UPDATE SET a.name = 'tbl1_updated'
WHEN NOT MATCHED THEN
INSERT (a.code, a.name) VALUES ('TEST2','tbl1_inserted');
TBR-10021: Inconsistent set of rows in source tables.
원인
문제가 발생하는 상황은 a.code에 맵핑되는 b.code가 2개가 select 되는 경우입니다. (TEST 2개)
ON 부분의 데이터가 유일하게 select 되어야 정상적인 동작이 가능합니다.
해결
- on 부분 test_tbl2 b 에 중복된 코드가 select 되지 않게 데이터 수정 하는 방식
-- 데이터 수정 시 정상동작
DELETE FROM test_tbl2 WHERE ROWNUM =1;
SQL> MERGE INTO test_tbl1 a USING (select code from test_tbl2) b
ON (a.code=b.code)
WHEN MATCHED THEN
UPDATE SET a.name = 'tbl1_updated_2nd'
WHEN NOT MATCHED THEN
INSERT (a.code, a.name) VALUES ('TEST2','tbl1_inserted');
1 row merged.정상 업데이트 확인
- on 절에 select 되는 코드 테이블에 제약조건 설정하여 중복된 값이 들어가지 않게 방지하는 방식
-- table 재생성
drop table test_tbl2;
-- 제약조건설정
CREATE TABLE test_tbl2 (
code varchar(10) UNIQUE
);
-- 샘플데이터 입력
insert into test_tbl2 values('TEST');
commit;
오류 유발 위해 중복데이터 입력 시도 하였으나 실패합니다.
insert into test_tbl2 values('TEST');
TBR-10007: UNIQUE constraint violation ('SYS'.'_SYS_CON54900481').