Grails调用Oracle含XMLTYPE输出参数存储过程参数不匹配报错求解
报错原因
- 参数类型不匹配:Oracle存储过程的OUT参数是原生
XMLType类型,你代码中指定的java.sql.Types.SQLXML是JDBC标准的XML类型,和Oracle专属的XMLType不兼容,Oracle驱动无法识别匹配。 - 若存在部分IN参数未正确传值的情况,也可能触发参数数量/类型校验错误:虽然存储过程中除
p_term外的其余IN参数声明了默认值,但如果调用时传入的null未正确绑定VARCHAR类型,也会被判定为类型不匹配。
解决方法
第一步:引入必要依赖
确保项目中引入适配Oracle 12c、JDK 11的驱动包:
- 核心驱动:
ojdbc8(版本建议≥12.2.0.1,适配JDK11) - XMLType支持包:
xdb6.jar
第二步:修正调用代码
使用Oracle专属的类型声明替换标准JDBC的SQLXML,调用示例如下:
import oracle.jdbc.OracleTypes import oracle.xdb.XMLType // 调用存储过程 sql.call('{call cl_sectiondownload_pk.p_main_xml(?,?,?,?,?,?)}', [termCode, crn, pin, hash, updated, OracleTypes.XML]) { XMLType resultXml -> // 8MB大小的XML直接用getStringVal读取即可,超大XML可以改用getBinaryStream流式读取 xmlOut = resultXml.getStringVal() }
可选优化:使用命名参数省略带默认值的入参
如果不需要传入p_crn、p_pin等带默认值的参数,可以改用命名参数写法减少参数数量,避免传参数量错误:
import oracle.jdbc.OracleTypes import oracle.xdb.XMLType // 仅传必填的p_term和OUT参数,其余用存储过程默认值 sql.call('{call cl_sectiondownload_pk.p_main_xml(p_term => ?, p_xml_clob => ?)}', [termCode, OracleTypes.XML]) { XMLType resultXml -> xmlOut = resultXml.getStringVal() }
内容的提问来源于stack exchange,提问作者Larry G
相关产品推荐
相关产品推荐

