문제 : 오라클 클라이언트 사용하여 Unload 시 10자리 초과의 숫자에 대해 지수형으로 저장하여 csv 파일을 다시 aurora로 이행시 지수형부분이 아래와 같이 뒷부분이 "000000"로 저장되는 문제 발생, 또한 99999999999 숫자의 경우 100000000000로 저장되는 문제 발생
Case 1)
오라클 ASIS 데이터 : 12345678912
Unload CSV 파일 : 1.23456E+10
Aurora 에서 데이터 : 1234000000
Case 2)
오라클 ASIS 데이터 : 99999999999
Unload CSV 파일 : 1.0000E+11
Aurora 에서 데이터 : 100000000000
해결 방안1)
SET NUM[WIDTH] {10|n}
SPOOL 파일에 SET NUMWIDTH 38 옵션을 추가, Default 값은 10, 11자리 이상은 지수로 표현함
n은 38까지 설정가능( 2~50 까지 가능하다고 하는데 테스트 해봐야함)
38자리로 설정하면 숫자는 공백을 포함하여 저장되는데 TOBE의 데이터 타입이 숫자형이라서 공백은 제외하고 데이터는 잘 들어간다.
ex) 123 -> ' 123' -> 123
spool on
SET PAGES 0
SET FEEDBACK OFF
SET HEADING ON
SET ECHO OFF
SET TERMOUT OFF
SET TRIMSPOOL ON
SET LONG 1000000
SET LONGCHUNKSIZE 100000
SET NUMWIDTH 38
ALTER SESSION SET NLS_DATE_FORMAT='YYYYYMMDDHH24MISS';
ALTER SESSION SET NLS_TIMESTAMP_FORMAT='YYYYMMDDHH24MISSXFF';
spool [PATH]
[SQL]
;
spool off
ex) numwidth 설정 예제
SQL> show numwidth
numwidth 10
SQL> SELECT 1234567891 num1, 12345678912 num2 from dual;
num1 | num2 |
--------------------------
1234567891 | 1.2346E+10 |
SQL> set numwidth 20
num1 | num2 |
---------------------------
1234567891 | 12345678912 |
해결방안2)
SET NUMF[ORMAT] format
NUMFORMAT을 설정한다. NUMFORMAT은 TO_NUMBER 형식 모델과 같은 방식으로 작동한다. 기본값은 ""(설정되지 않음) 이다.
SQL> select 12345 from dual;
12345
------
12345
SQL> set numformat 0000000000
SQL> select 12345 from dual;
12345
----------
0000012345
SQL> set numformat 99999.00
SQL> select 12345 from dual;
12345
---------
12345.00
해결방은 3)
Unload 하기 전에 SQL에 숫자형 데이터에 to_char() 로 문자형으로 형변환한다. 문자형은 지수변환하지 않고 데이터 그대로 저장하고 TOBE에 입력할 때 숫자형으로 변환된다.
하지만, 숫자 컬럼이 많아서 해당 방법은 적용하지 않았다.
결론은 1번 방안으로 선택하였다.
'MySQL > Oracle to Aurora' 카테고리의 다른 글
| 'ABC' == 'ABC ' unique 비교시 동일 처리 (0) | 2024.12.04 |
|---|---|
| 표준 Json 타입 전환 방안(oracle to mysql) (0) | 2024.12.04 |
| loader 로 insert시 행1개가 2개로? @-> ? (0) | 2024.12.04 |
| Recursive CTE를 이용한 계층쿼리 (0) | 2024.12.04 |
| CHAR vs VARCHAR 공백(blink) 저장 및 비교 (0) | 2024.12.04 |