从现有资料里,能确认的点主要有这些:
-
在 Java 里调用存储过程,推荐使用
CallableStatement,并按call 包名.存储过程名(?)这种形式准备语句,再逐个设置参数后执行;文档示例也是这样做的,而不是直接把参数值硬编码进 SQL 字符串里执行。[1] -
InterSystems 文档明确提到,调用存储过程时,语句必须为 SQL 所要求的每一个 input 或 input/output 参数都提供参数。如果参数个数或类型理解不一致,就可能出现你描述的这类 “Parameter list mismatch” 问题。[2]
-
另外,InterSystems 也明确提到,JDBC 相关问题里有一类就是:“Caché 对 JDBC 的理解”和“远端数据库/驱动对 JDBC 的理解”之间存在不匹配,其中就包括 stored procedure with output parameters。这种场景官方建议通过日志分析实际发送内容,并用独立 Java 程序复现来定位。[3]
基于这些资料,你现在可以这样检查:
-
不要只在 Java 中直接执行
CALL DHCXXXXice.MKPIQuery_QueryXXXX('K007XXXX.JJR','2024-08-01','2024-08-01')
而应改成使用CallableStatement,例如先准备类似
call DHCXXXXice.MKPIQuery_QueryXXXX(?,?,?,?,?,?,?,?)
这样的语句,再逐个绑定参数后执行。[1][2] -
既然你查到该存储过程“可接收参数为 8 个”,那 Java 侧需要确认:这 8 个参数里哪些是 input,哪些是 output / input-output。因为文档特别指出,存储过程调用时需要为每个必需的 input 或 input/output 参数提供参数;而涉及 output 参数时,JDBC 与数据库之间更容易出现不匹配问题。[2][3]
-
如果连接工具能查出来、Java 代码不行,资料建议的定位方式是:
3 中还有一句和你这个场景非常相关:
[!NOTE]
This reference lists only the extension methods and variants discussed elsewhere in this document. See "JDBC Driver Support" in the Implementation Reference for Java Third Party APIs for a complete description of all InterSystems JDBC driver features, including extensions, variants, and implementation of optional JDBC features. [4]
以及 11 中的关键限制:
[!IMPORTANT]
The name of the stored procedure is case-sensitive. Also, make sure that the pQueryStatement statement supplies an argument for every input or input/output parameter that the SQL query requires. [2]
所以,单从资料能得出的结论是:你的问题更像是 Java/JDBC 对该存储过程参数签名的调用方式不正确,或者该过程包含 output / input-output 参数,导致 JDBC 调用时参数列表解释与连接工具不同。[3][2]
如果你愿意,我可以下一步帮你把这个调用改写成一个标准的 Java CallableStatement 示例模板,方便你直接对照代码排查。[1]
Sources:
- Log in to post comments