[이슈사항]
Oracle to MySQL에서 Loader로 데이터 삽입시 행이 하나가 더 들어간다.
[원인]
loader를 사용하여 @가 포함되어있는 varchar를 mysql로 insert시에 행이 두개로 분리된다. 이문제는 특히 @가 맨뒤에 있을때 발생한다. @/n이 문제가 된다.
(유닉스에서 @/n 새로운 행으로 인식한다.)
예시)
ISSUE_COLUMN
-----------------------
이 @의 문제는 맨 끝에 올때 문제가 생긴다.@
@앞에오면 전혀 문제가 없다.@
.....
[해결]
CHR(13) = /r 은 동일한 자리에 첫번째 자리에 커서를 위치시킵니다.
CHR(10) = /n 은 현재 커서가 위치한 곳에서 한줄 아래로 내립니다.
엔터키 = CHR(13)CHR(10)
@가 행의 끝에 올때 @||CHR(10)의 형태로 있어서 데이터가 한개의 행이 두개의 행으로 분리되어서 삽입되는 현상이 발생한다. CHR(13) = /r을 추가해 데이터를 삽입하면 정상적으로 한줄만 데이터가 생성된다.
SQL)
SELECT /*+FULL(A) PARALLEL(A 16)*/
ISSUE_COLUMN
, REPLACE(ISSUE_COLUMN,'@'||CHR(10), '@'||CHR(13)||CHR(10))
FROM ISSUE_TABLE A
WHERE 1=1
AND ISSUE_COLUMN LIKE '%@'||CHR(10)||'%'
;
[결론]
행끝에 "@/n"가 오면 loader시에 "@/n" 기준으로 두개의 행으로 분리된다.
"@/n"이 끝에오면 "@/n" --> "@/r/n" 으로 변환하여 전환한다.
[행이 여러개로 삽입될때 해결방법2]
다른 방법으로 컬럼에 엔터와 스페이스가 남발하고 엔터로 인해 행이 여러개 추가된다면 아래의 방법을 사용할 수 도 있다.
chr(10) ==> '##enter##'로 바꾸고
스페이스문자는 '( )+' ==> chr(32)로 바꾸고
컬럼간의 구분문자('||||') 를 추가해준다.
SELECT NVL(COL1, 'NULL')
||'||||'||NVL(COL2,'NULL')
||'||||'||NVL(REGEXP_REPLACE(REPLACE(COL3,CHR(10),'##enter##'),'( )+,CHR(32)),'NULL')
||'||||'||NVL(COL4,'NULL') AS SCRIPT
FROM TABLE_DATA
ORDER BY COL1
[loader.ctl 파일의 내용중 일부]
load data
infile ...
append
into table tobe_table_data
filelds terminated by '||||'
trailing nuullcols
(col1
,col2
,col3
,col4
)
[이행후 작업]
이행후에 'NULL' 을 ''으로 엔터를 /n('##enter##'=> chr(10) 으로 변경해 준다.
UPDATE (
SELECT COL1, DECODE(COL1,'NULL','',COL1) AS COL1_UPD
COL2, DECODE(COL2,'NULL','',COL2) AS COL2_UPD
COL3, REPLACE(DECODE(COL3,'NULL','',COL3),'##enter##',CHR(10)) AS COL3_UPD
COL4, DECODE(COL4,'NULL','',COL4) AS COL4_UPD
FROM TABLE_DATA
)
SET
COL1 = COL1_UPD
,COL2 = COL2_UPD
,COL3 = COL3_UPD
,COL4 = COL4_UPD
;
COMMIT;
'MySQL > Oracle to Aurora' 카테고리의 다른 글
| 'ABC' == 'ABC ' unique 비교시 동일 처리 (0) | 2024.12.04 |
|---|---|
| 표준 Json 타입 전환 방안(oracle to mysql) (0) | 2024.12.04 |
| Recursive CTE를 이용한 계층쿼리 (0) | 2024.12.04 |
| CHAR vs VARCHAR 공백(blink) 저장 및 비교 (0) | 2024.12.04 |
| 파티션키는 PK에 포함된 속성 (0) | 2024.12.04 |