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시간 동안 해매다가 겨우 해결한 문제,,,
'web > DB' 카테고리의 다른 글
[mysql] 암호화 & 복호화, 인코딩&디코딩 (0) | 2021.07.01 |
---|---|
[mysql] windows 'mysql'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다. /mysql 환경 변수 설정하기 (7) | 2021.04.08 |
[mysql] 행 번호 rownum 출력하기(역순, join table) (0) | 2020.12.24 |
댓글