如何使用Java中的一个或多个INOUT参数调用postres过程

时间:2019-05-16 13:34:13

标签: java postgresql jdbc callable-statement

postgresql 11中有一个存储过程:

  .my-element::-webkit-scrollbar {
    display: none;
    width: 0 !important;
    height: 0 !important;
    -webkit-appearance: none;
    background: transparent; // HERE IS THE TRICK
  }

它工作完美,但是我无法从我的Java代码中调用它:-(

我有postgresql 11和java8。我尝试了两个postgres jdbc驱动程序org.postgresql:postgresql:42.2.5和postgresql:postgresql:9.1-901-1.jdbc4结果相同

当我使用

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抛出: 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 个答案:

答案 0 :(得分:0)

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

查看详细信息:https://github.com/pgjdbc/pgjdbc/pull/1475