기술 정보
home
채널 소개
home

Tomcat에서 프로시저 호출 시 ERROR_NUMBER_DIVIDE_BY_ZERO(-5070) 에러 발생

문서 유형
장애 해결
분야
인터페이스/연동
키워드
encoding
ERROR_NUMBER_DIVIDE_BY_ZERO
tomcat
TO_CHAR
요일
적용 제품 버전
6FS07
6FS07PS
1 more property

현상

Tomcat에서 Tibero 프로시저를 호출할 때, TO_CHAR(TO_DATE(컬럼명, 'YYYYMMDD'), 'DY') 함수의 반환값이 언어 설정에 따라 다르게 처리되며, 이로 인해 연산 중 0으로 나누는 상황이 발생하면서 아래 오류가 발생할 수 있습니다.
에러 코드: ERROR_NUMBER_DIVIDE_BY_ZERO(-5070)
발생 시점: Tomcat에서 TO_CHAR(..., 'DY') 함수를 포함한 프로시저를 호출할 때
이 에러는 숫자형 컬럼 값이 0일 때 나눗셈 연산이 수행되며 나타나는데, Tomcat과 Tibero 간 인코딩이 일치하지 않는 경우, Tomcat이 기본 인코딩 설정을 지정하지 않으면 요일 명이 영문으로 처리됩니다.

원인

Tomcat의 기본 인코딩 값이 영문(EN)이기 때문에, TO_CHAR(YYYYMMDD,'DY')함수 사용 시 요일명이 영문으로 반환됩니다. 따라서 연산 작업에서 Tibero에서 기대되는 값(한글 - "월")과 기대 값이 일치하지 않는다면 프로시저 실행 시 연산 중 에러가 발생합니다.
Tomcat 결과: "MON", "TUE" 등 영문 요일
Tibero CLI 결과: "월", "화" 등 한글 요일
인코딩이 다를 경우, 비정상적 연산 처리가 되어 0값이 계산되고 ERROR_NUMBER_DIVIDE_BY_ZERO 발생이 가능합니다.

해결

Tomcat 실행 시 인코딩 설정을 한글로 설정하여 요일 명이 일치하도록 수정합니다.
1. Tomcat Config에 아래 인코딩 설정 추가
-Duser.language=ko -Duser.country=KR -Dfile.encoding=UTF-8"
SQL
복사
2. Tomcat 재실행
$ systemctl restart tomcat
SQL
복사

테스트 시나리오

1. Tomcat에 인코딩 설정 전 특정 날짜에 대한 요일 명 Tomcat에서 프로시저를 호출합니다.
SQL> select * from Day_ck; DD ---------- MON
SQL
복사
2. Tomcat에 인코딩 설정 후 특정 날짜에 대한 요일 명 Tomcat에서 프로시저를 호출합니다.
SQL> select * from Day_ck; DD '----------
SQL
복사

테스트 상세 내용

1. Procedure 및 테이블을 생성합니다.
로그 테이블 생성 SQL> CREATE TABLE DAY_CK (DD VARCHAR2(10));
SQL
복사
프로시저 생성 CREATE OR REPLACE PROCEDURE SYSDATE_COUNT( AutoDate IN VARCHAR2 ) IS TEMP VARCHAR(8); BEGIN TEMP := TO_CHAR(TO_DATE(AutoDate,'YYYYMMDD'),'DY'); INSERT INTO DAY_CK(DD) VALUES(TEMP); COMMIT; END; /
SQL
복사
2. DB 에서 프로시저를 호출합니다.
SQL> call SYSDATE_COUNT(20240822);
SQL
복사
아래 결과를 확인합니다.
SQL> select * from Day_ck; DD '----------
SQL
복사
3. Tomcat에서 프로시저를 호출합니다.
try{ conn = DriverManager.getConnection(dbURL,username,password); out.println("Tibero Database 에 접속 성공!"); cs = conn.prepareCall("CALL SYSDATE_COUNT(?)"); cs.setString(1,"20240701"); cs.executeQuery(); ... 중략 ...
SQL
복사
SQL> select * from Day_ck; DD ---------- MON
SQL
복사