본문 바로가기

Data Layter/TIBERO

JDBC-5074

JDBC-5074:Given string does not represent a number in proper format.

정말 화나는 티베로 버그이다. 인터넷을 검색해보면 오라클은 날짜 자동 형변환해주고, 티베로는 안해줘서 생기는 오류라고 나온다. 이런 경우에도 분명 JDBC-5074가 발생한다.

 

그러나! 아래와 같이 쿼리를 짰다고 가정하자

INSERT INTO TB_WORKS_USER_CATEGORY
SELECT
    TB_WORKS_USER_CATEGORY_SEQ.NEXTVAL AS USER_CATEGORY_ID
    ,T.*
    ,'' MOD_USER
    ,'' MOD_DATE
FROM 
    (SELECT 
        T1.USER_ID AS USER_ID
        ,'WORKS_CM_BASIC' AS USER_CATEGORY_NAME
        ,'UCTYPE1000' AS USER_CATEGORY_TYPE
        ,1 AS ORDER_LEVEL 
        ,(SELECT USER_ID FROM TB_USER_MST WHERE USER_NAME='admin' AND ROWNUM = 1) REG_USER
        ,TO_TIMESTAMP_TZ(TO_TIMESTAMP(SYSTIMESTAMP), 'YYYY.MM.DD HH24:MI:SS.FF3') REG_DATE
    FROM
        (SELECT USER_ID FROM TB_USER_MST WHERE USE_CODE = 'USE0001') T1
    WHERE NOT EXISTS
        (SELECT USER_ID FROM TB_WORKS_USER_CATEGORY WHERE USER_CATEGORY_TYPE='UCTYPE1000' AND USER_ID=T1.USER_ID)
    ) T;

 

REG_DATE DATA_TYPE은 정상이고, MODI_DATE는 NULL 허용으로 해서 문제가 없이 insert 가능하다!

사실상 이 쿼리는 문제가 없어야 하는게 맞다! 하지만 JDBC-5074가 발생한다.

 

이 오류의 해결방법은 INSERT 할 테이블의 컬럼을 명시해주면 해결된다

INSERT INTO TB_WORKS_USER_CATEGORY
-- (USER_CATEGORY_ID, USER_ID, USER_CATEGORY_NAME, USER_CATEGORY_TYPE, ORDER_LEVEL, REG_USER, REG_DATE, MOD_USER, MOD_DATE)
SELECT
    TB_WORKS_USER_CATEGORY_SEQ.NEXTVAL AS USER_CATEGORY_ID
    ,T.*
    ,'' MOD_USER
    ,'' MOD_DATE
FROM 
    (SELECT 
        T1.USER_ID AS USER_ID
        ,'WORKS_CM_BASIC' AS USER_CATEGORY_NAME
        ,'UCTYPE1000' AS USER_CATEGORY_TYPE
        ,1 AS ORDER_LEVEL 
        ,(SELECT USER_ID FROM TB_USER_MST WHERE USER_NAME='admin' AND ROWNUM = 1) REG_USER
        ,TO_TIMESTAMP_TZ(TO_TIMESTAMP(SYSTIMESTAMP), 'YYYY.MM.DD HH24:MI:SS.FF3') REG_DATE
    FROM
        (SELECT USER_ID FROM TB_USER_MST WHERE USE_CODE = 'USE0001') T1
    WHERE NOT EXISTS
        (SELECT USER_ID FROM TB_WORKS_USER_CATEGORY WHERE USER_CATEGORY_TYPE='UCTYPE1000' AND USER_ID=T1.USER_ID)
    ) T;

 

뭐 이것도 관점에 따라 다르게 보면 날짜 형변환을 안하는 티베로 특성이라고 볼 수 도 있겠지만

공백은 좀 더 다른 개념인데다가, 컬럼을 명시하면 오류가 발생하기 때문에 버그가 맞는것 같다.