MyBatis调用PostgreSQL存储过程报错提示需使用CALL如何解决
问题根因
- PostgreSQL 11及以上版本的存储过程(PROCEDURE)与函数(FUNCTION)调用规则存在差异,你当前使用的
{ call 存储过程名 }是JDBC标准转义语法,仅适用于调用函数,PostgreSQL JDBC驱动不支持通过该语法调用存储过程,要求直接使用原生CALL关键字执行存储过程。 - 你使用
<select>标签执行无结果集返回的存储过程,也会导致MyBatis执行逻辑匹配错误。 - 报错信息中显示存储过程归属
accountsschema,你的XML配置中未指定schema前缀,若会话默认schema不是accounts也会触发定位错误。
解决方案
直接修改XML Mapper配置:
- 将
<select>标签替换为<update>标签(无结果集返回的存储过程使用更新类标签即可) - 去掉
{ }JDBC转义包裹符,直接使用原生CALL语法 - 补充存储过程归属的
accountsschema前缀
修改后的配置如下:
<update id="executeStoredProcedure" statementType="CALLABLE"> CALL accounts.update_login( aws_oracle_ext.TRUNC(#{date}) - (10 / 1440 || ' days')::INTERVAL, aws_oracle_ext.TRUNC(#{date}) + (5 / 1440 || ' days')::INTERVAL, 1000 ) </update>
修改后无需调整Mapper接口定义,直接调用即可。
内容的提问来源于stack exchange,提问作者Aeonstrife
相关产品推荐
相关产品推荐

