首页 > 解决方案 > 如何使用 java 中的一个或多个 INOUT 参数调用 postres 过程

问题描述

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 throws: org.postgresql.util.PSQLException: ERROR: 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 throws: org.postgresql.util.PSQLException: 此语句未声明 OUT 参数。使用 { ?= call ... } 来声明一个。

我期望调用另一个没有 INOUT 参数的过程。

有什么建议吗?

标签: javapostgresqljdbccallable-statement

解决方案


jdbc 驱动程序包含错误但不能轻易修复,因为它破坏了向后兼容性:-(

查看详情:https ://github.com/pgjdbc/pgjdbc/pull/1475


推荐阅读