반응형
CHAR 타입으로 인한 MERGE문 실행 시 무결성 오류가 나는 경우
* MERGE문은 조건에 만족하면 INSERT와 UPDATE로 알아서 분기된다. 두 개 이상의 세션에서 동시에 날려서 PK가 중복된 경우는 당연히 발생 가능하다. 그런데 난 혼자 개발 중인데 왜 무결성 오류가 날까?
* 우선 에러가 발생한 쿼리를 먼저 보면 ON절에 키값 1개만 걸린 매우 기본적인 MERGE문이다.
MERGE
INTO TABLE_A A
USING DUAL
ON (A.KEY1 = #KEY1#)
WHEN MATCHED THEN
UPDATE SET ()
WHEN NOT MATCHED THEN
INSERT () VALUES ()
* 이 쿼리 실행 시 무결성 오류가 난다면 KEY1의 데이터 타입이 CHAR 인지 확인해보자.
* 만약 CHAR 타입이 맞다면 이제 우린 CHAR와 VARCHAR2의 특성을 알아야 된다. (아래 포스팅 읽어보는걸 추천한다)
* 위 포스팅의 내용을 요약하면, CHAR는 선언된 자리수 만큼 공백을 붙이게 된다.
- CHAR(5) = 'ABC '
- VARCHAR2(5) = 'ABC'
* 이 과정에서 WHERE절에서 오류가 나게 된다. DB툴에서는 상수로 비교해 문제가 안 생기고, 바인드 변수로 비교할 때 FALSE가 된다.
해결방법
1) 컬럼타입 VARCHAR2로 변경
* 최고의 방법은 CHAR를 VARCHAR2로 변경하는 것이다. (데이터 타입변경은 아래 포스팅 참고)
2) 컬럼타입 변경이 어려우면 SQL 변경
* 컬럼을 바꾸는 것도 쉬운 일은 아니기에 아래처럼 수정하면 정상 작동한다.
* TRIM 보다는 RPAD를 추천한다.
A.KEY1 = RPAD( #KEY1#, 컬럼사이즈, ' ')
또는
TRIM(A.KEY) = #KEY1#
이거 때문에 하루종일 고생했는데
유사한 문제가 생기신 분이 참고하셔서 잘 해결되시길
그리드형
'IT > DB' 카테고리의 다른 글
[ORACLE] DB Tool 한글 깨짐 현상 해결 방법(오렌지, Toad 등) (0) | 2021.11.24 |
---|---|
[ORACLE] PL/SQL 에러 PLS-00363 : 프로시저 실행 안 될 때 해결방법 (0) | 2021.10.29 |
[ORACLE] 오라클 데이터타입 CHAR와 VARCHAR2의 차이 (0) | 2021.10.26 |
[ORACLE] 오라클 LPAD, RPAD, TRIM, LTRIM, RTRIM (자리 수 채우기/지우기) (0) | 2021.10.26 |
[ORACLE] 알아두면 유용한 오라클 딕셔너리 (Oracle Dictionary) (0) | 2021.09.30 |
댓글