Data Layter/TIBERO
JDBC-5074
피고녀
2021. 11. 16. 23:24
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;
뭐 이것도 관점에 따라 다르게 보면 날짜 형변환을 안하는 티베로 특성이라고 볼 수 도 있겠지만
공백은 좀 더 다른 개념인데다가, 컬럼을 명시하면 오류가 발생하기 때문에 버그가 맞는것 같다.