리모트 DB 조회 시 문자열 정보 NULL로 표시 되는 이유를 알고 싶습니다.
- 작성자 :
- 김*홍
- 작성일 :
- 2021-10-27 18:03:20
- 조회수 :
- 3,035
- 구분 :
- 실행환경 / 3.9
- 진행상태 :
- 완료
Q
안녕하세요.
현재 저희 AP서버에서 MyBatis를 통해 생성된 조회쿼리로 2개의 타 시스템(oracle 9i, oracle11g)의 DB를 select하고 그 결과 값을 vo객체에 setting 후, 화면에 출력하려고 하는데, oracle 9i DB에 있는 값을 조회시에는 값이 있음에도 전부 null로 표시 됩니다.
동일한 소스로 2개(Oracle 9i, Oracle 11g)의 원격 DB 접속 시 ORACLE 11g로 되어 있는 DB는 정상조회하여 한글, 영문자, 숫자 등을 출력합니다.
그런데, oracle 9i DB접속 시 조회한 결과값은
숫자형 문자들은 TO_NUMBER로 변환하여야만 데이터가 출력이되고,
한글, 영문자 등은 LENGTH(TRIM(STR))을 하면 글자수가 나오고, HEX값으로 변경 시 해당 데이터(STR)의 HEX값이 출력되지만
문자열을 그대로 출력하려고 하면 NULL로 출력되고, HEX값으로 변경한 값을 다시 문자열로 출력하려고 하면 null로 표시 됩니다.
아무리 찾아봐도 이유를 모르겠습니다.
예를 들어 실제 값들이 ELC_NO가 "12345" 그리고 '56789' 이고, CN_NABSENM이 "홍길동" 또는 "HANA", STR이 "1234567890120000003000"이라고 한다면
<select id="V041SelectList" parameterType="hb.app.va.jb.vo.V041VO" resultType="hb.app.va.jb.vo.V041VO">
<![CDATA[
SELECT '0' AS CHK,
TRIM(ELC_NO) AS ELCNO,
CN_NABSENM AS TAX_NM,
SUBSTR(STR, 1, 5) AS INST_CD,
TO_NUMBER(SUBSTR(TRIM(STR), 12, 11)) AS AMT
FROM TAX_TB
WHERE S_SUNAP_NO IN ('1111', '222')
;
이 결과 값은 ,
CHK 0, ELCNO null, INST_CD null, AMT 3000 으로 출력이 됩니다.
그런데 LENGTH(TRIM(ELC_NO)) 을 하면 5가 출력이 되고, UTL_RAW.CAST_TO_RAW(TRIM(ELC_NO)) AS ELCNO 이렇게 할 경우 "3132333435"이 출력됩니다.
그리고 TAX_NM도 NULL이 출력되는 데, LENGTH(TRIM(CN_NABSENM ))을 하면 "홍길동"일때 3, "HANA"일때 4가 출력되고 HEX값도 출력됩니다.
ORACLE 9i와 ORACLE 11g DB는 모두다 동일한 character Set으로 되어 있습니다.
- CHARACTERSET - KO16MSWIN949, NCHAR_CHARACTERSET - UTF8
저희 쪽은
- CHARACTERSET - KO16MSWIN949, NCHAR_CHARACTERSET - AL16UTF16
입니다.
참고로 원격 DB둘다 CN_NABSENM 는 VARCHAR2입니다.
현재 저희 AP서버에서 MyBatis를 통해 생성된 조회쿼리로 2개의 타 시스템(oracle 9i, oracle11g)의 DB를 select하고 그 결과 값을 vo객체에 setting 후, 화면에 출력하려고 하는데, oracle 9i DB에 있는 값을 조회시에는 값이 있음에도 전부 null로 표시 됩니다.
동일한 소스로 2개(Oracle 9i, Oracle 11g)의 원격 DB 접속 시 ORACLE 11g로 되어 있는 DB는 정상조회하여 한글, 영문자, 숫자 등을 출력합니다.
그런데, oracle 9i DB접속 시 조회한 결과값은
숫자형 문자들은 TO_NUMBER로 변환하여야만 데이터가 출력이되고,
한글, 영문자 등은 LENGTH(TRIM(STR))을 하면 글자수가 나오고, HEX값으로 변경 시 해당 데이터(STR)의 HEX값이 출력되지만
문자열을 그대로 출력하려고 하면 NULL로 출력되고, HEX값으로 변경한 값을 다시 문자열로 출력하려고 하면 null로 표시 됩니다.
아무리 찾아봐도 이유를 모르겠습니다.
예를 들어 실제 값들이 ELC_NO가 "12345" 그리고 '56789' 이고, CN_NABSENM이 "홍길동" 또는 "HANA", STR이 "1234567890120000003000"이라고 한다면
<select id="V041SelectList" parameterType="hb.app.va.jb.vo.V041VO" resultType="hb.app.va.jb.vo.V041VO">
<![CDATA[
SELECT '0' AS CHK,
TRIM(ELC_NO) AS ELCNO,
CN_NABSENM AS TAX_NM,
SUBSTR(STR, 1, 5) AS INST_CD,
TO_NUMBER(SUBSTR(TRIM(STR), 12, 11)) AS AMT
FROM TAX_TB
WHERE S_SUNAP_NO IN ('1111', '222')
;
이 결과 값은 ,
CHK 0, ELCNO null, INST_CD null, AMT 3000 으로 출력이 됩니다.
그런데 LENGTH(TRIM(ELC_NO)) 을 하면 5가 출력이 되고, UTL_RAW.CAST_TO_RAW(TRIM(ELC_NO)) AS ELCNO 이렇게 할 경우 "3132333435"이 출력됩니다.
그리고 TAX_NM도 NULL이 출력되는 데, LENGTH(TRIM(CN_NABSENM ))을 하면 "홍길동"일때 3, "HANA"일때 4가 출력되고 HEX값도 출력됩니다.
ORACLE 9i와 ORACLE 11g DB는 모두다 동일한 character Set으로 되어 있습니다.
- CHARACTERSET - KO16MSWIN949, NCHAR_CHARACTERSET - UTF8
저희 쪽은
- CHARACTERSET - KO16MSWIN949, NCHAR_CHARACTERSET - AL16UTF16
입니다.
참고로 원격 DB둘다 CN_NABSENM 는 VARCHAR2입니다.
환경정보
-
- OS 정보 : Solaris
- 표준프레임워크 버전 : 전자정부표준프레임워크 3.9
- JDK(JRE) 정보 : jdk1.8
- WAS 정보 : jeus
- DB 정보 : ORCLE12C
- 기타 환경 정보 : ojdbc6.jar
A
안녕하세요.
표준프레임워크센터입니다.
현재 문의주신 내용에 대해서는 구성환경 등을
알수 없어서 답변을 드리기 어렵습니다.
테이블 컬럼의 데이터타입이나
오라클 함수를 사용하지 않은 상태에서의
조회 결과 등을 먼저 확인해보시기 바랍니다.
오라클의 설정 방법이나 운영 방법와 같은
구체적인 내용은 벤더쪽에 문의를 해보셔야 할 것 같습니다.
감사합니다.
표준프레임워크센터입니다.
현재 문의주신 내용에 대해서는 구성환경 등을
알수 없어서 답변을 드리기 어렵습니다.
테이블 컬럼의 데이터타입이나
오라클 함수를 사용하지 않은 상태에서의
조회 결과 등을 먼저 확인해보시기 바랍니다.
오라클의 설정 방법이나 운영 방법와 같은
구체적인 내용은 벤더쪽에 문의를 해보셔야 할 것 같습니다.
감사합니다.