如何从 java 调用带有一个或多个 INPUT 参数的 postgres 过程
Posted
技术标签:
【中文标题】如何从 java 调用带有一个或多个 INPUT 参数的 postgres 过程【英文标题】:How can I call a postres procedure with one or more INOUT parameters from java 【发布时间】:2019-05-16 13:34:12 【问题描述】:postgresql 11中有一个存储过程:
CREATE OR REPLACE PROCEDURE clone_ad (
p_src_ad_id BIGINT,
p_ad_def_id BIGINT,
p_user_id BIGINT,
p_dst_ad_id INOUT BIGINT)
AS ...
效果很好,但我无法从我的 java 代码中调用它:-(
我有 postgresql 11 和 java 8。我尝试了两个 postgres jdbc 驱动程序 org.postgresql:postgresql:42.2.5 和 postgresql:postgresql:9.1-901-1.jdbc4 结果是一样的
当我使用时
stmt = conn.prepareCall(" call clone_ad(?, ?, ?, ?)");
stmt.setLong(1,1L);
stmt.setLong(2,1000L);
stmt.setLong(3,999L);
stmt.setObject(4,null, Types.BIGINT);
stmt.registerOutParameter(4, Types.BIGINT);
boolean hadResults = stmt.execute();
java 抛出: org.postgresql.util.PSQLException: 错误: clone_ad(bigint, bigint, bigint, bigint) 是一个过程 提示:要调用过程,请使用 CALL。
当我使用
stmt = conn.prepareCall("call clone_ad(?, ?, ?, ?)");
stmt.setLong(1,1L);
stmt.setLong(2,1000L);
stmt.setLong(3,999L);
stmt.setObject(4,null, Types.BIGINT);
stmt.registerOutParameter(4, Types.BIGINT);
boolean hadResults = stmt.execute();
java 抛出: org.postgresql.util.PSQLException:此语句未声明 OUT 参数。使用 ?= call ... 声明一个。
调用没有 INOUT 参数的另一个过程符合我的预期。
有什么建议吗?
【问题讨论】:
【参考方案1】:jdbc 驱动程序包含错误但不能轻易修复,因为它破坏了向后兼容性:-(
查看详情:https://github.com/pgjdbc/pgjdbc/pull/1475
【讨论】:
以上是关于如何从 java 调用带有一个或多个 INPUT 参数的 postgres 过程的主要内容,如果未能解决你的问题,请参考以下文章
我可以在不使用 javascript 的情况下从带有 href 或其他内容的 .html 文件调用 .java 文件吗[关闭]