如何从 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 文件吗[关闭]

如何使用 JNI 从 JAVA 调用带有 C++ 参数的函数?

如何从 JAVA 调用 AWS lambda 函数?

Java:合并输入流

如何将多个参数从 ajax 调用传递到 MVC 控制器

如果我同时(从多个线程)写入java.util.HashMap会发生什么最糟糕的事情?