본문 바로가기
web/DB

[mybatis/mysql] mysql procedure 사용 시 OUT parameter 오류 해결 방법

by fien 2021. 11. 2.

mybatis에서 mysql procedure를 사용하기 위해

다음과 같이 mapper 파일에 작성했다.

<select id="myProcedure" parameterType="kr.co.mytest.common.model.testVO" statementType="CALLABLE">
        {call myProcedure(
                #{inputParam1, mode=IN, jdbcType=INTEGER}
              , #{inputParam2, mode=IN, jdbcType=VARCHAR}
              , #{outputParam1, mode=OUT, jdbcType=VARCHAR}
        )}
</select>

 

ERROR 1. CallableStatement.registerOutParameter(18, 12)
java.sql.SQLException: Parameter number 18 is not an OUT parameter

 

쿼리를 호출하니 input 파라미터는 잘 들어가는데

out 파라미터를 제대로 인식하지 못하는 오류가 발생했다.

 

 

mode를 지정하지 않고 #{outputParam1} 로만 작성하면

다음과 같은 오류가 발생한다.

java.sql.SQLSyntaxErrorException: OUT or INOUT argument 19 for routine XXXXXX is not a variable or NEW pseudo-variable in BEFORE trigger

 

#{outputParam1} 대신 @outputParam1 으로 선언하면 쿼리는 동작하지만 값을 읽어오지 못해서 null 값이 들어온다.

(@붙이면 mysql 상에서 동작하는 변수)

 

예제를 보면 다 VO 객체가 아닌 hashmap을 썻길래 map으로 바꿔도 보고

resultType, parameterType도 다 건들어 보고

{ 와 ( 사이 스페이스인지 탭인지도 바꿔보고 했는데 문제는 변함 없었다.

 

결론은

db 커넥션 설정 문제였다

설정 파일에서 db url에 noAccessToProcedureBodies=true 를 붙여주면 아주 잘 동작한다.

자세히는 안 찾아 봤지만 프로시저 사용 권한을 주는 옵션인 것 같다.

url: jdbc:log4jdbc:mysql://{dbUrl}?zeroDateTimeBehavior=convertToNull&characterEncoding=UTF-8&serverTimezone=UTC&noAccessToProcedureBodies=true

설정파일 변경 후 쿼리 실행 로그를 살펴보면 out parameter 자리에 이 들어오는 것을 확인 할 수 있다.

{call myProcedure(
                'inputparam1'
              , 'inputparam2'
              , '<OUT>'
)}

paramterType이 vo객체여도 잘 동작하고

call 쿼리를 {} 로 감싸주지 않아도 동작한다.

 

중국어 나올 때까지 5시간 동안 해매다가 겨우 해결한 문제,,,

댓글