mybatis에서 프로시저를 생성하여 호출할때 발생한에러이다.
<!-- 파라메터 수정 -->
<update id="callPrcDelPData" statementType="CALLABLE">
<if test="retentionPeriod != null and retentionPeriod != '' ">
CALL prc_del_pdata(#{retentionPeriod, jdbcType =INTERVAL})
</if>
</update>
MyBatis에서는 기본적으로 INTERVAL 타입을 지원하지 않기 때문이다.
postgreSql 의경우 timestamp without time zone 타입과 integer 타입 간에 빨샘 연산이 불가능 실패
- interval 파라미터명 month - interval '1' day;
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>