You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 07:36:03