[이슈사항]

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;

+ Recent posts