[에러노트] java.lang.IllegalArgumentException: No enum constant org.apache.ibatis.type.JdbcType.INTERVAL

hyewon jeong·2024년 9월 26일
0

에러노트

목록 보기
45/46

1 발생

mybatis에서 프로시저를 생성하여 호출할때 발생한에러이다.


2 코드

	<!-- 파라메터 수정 -->
	<update id="callPrcDelPData" statementType="CALLABLE">
		<if test="retentionPeriod != null and retentionPeriod != '' ">
			CALL prc_del_pdata(#{retentionPeriod, jdbcType =INTERVAL})
		</if>
	</update>

3 원인

MyBatis에서는 기본적으로 INTERVAL 타입을 지원하지 않기 때문이다.


4 시도

1. 파라미터 값 안에 interval을 넣어 형변환 할수 있도록 했지만 실패

2. interval 을 사용하지 않고 직접 수학적 계산을 하려고 했으나

postgreSql 의경우 timestamp without time zone 타입과 integer 타입 간에 빨샘 연산이 불가능 실패

- interval 파라미터명 month - interval '1' day; 

5 해결

interger → timestamp 변환도 뺏셈도 안됐지만 ?
integer*interval 은 되어 아래와 같은 코드로 해결했다.

입력값을 varchar 타입으로 받아 integer로 변환후 월단위('1 month' interval) 로 곱하니 해결 되었다.

CREATE OR REPLACE PROCEDURE proc_del_pdata(IN retention_period character varying)
 LANGUAGE plpgsql
AS $procedure$
begin
	
-- INSERT 쿼리
    INSERT INTO tableA (reg_dt, b, c, d)
    SELECT reg_dt, b, c, d
    FROM tableB
    WHERE reg_dt < date_trunc('day',now()::timestamp) - (retention_period::integer * interval '1 month') - interval '1' day;

    -- DELETE 쿼리
    DELETE FROM tableB
    WHERE reg_dt < date_trunc('day',now()::timestamp) - (retention_period::integer * interval '1 month') - interval '1' day;


EXCEPTION
    WHEN OTHERS THEN
        RAISE NOTICE 'An error occurred: %', SQLERRM;
END;
$procedure$
;

호출쿼리

	<delete id="updateProcDelDrvHs" statementType="CALLABLE">
		<if test="retentionPeriod != null and retentionPeriod != '' ">
			CALL proc_del_pdata(#{retentionPeriod, jdbcType =VARCHAR})
		</if>
	</delete>

TimeStamp, Date 데이터 타입 사용법

profile
개발자꿈나무

0개의 댓글