当前位置: 首页 > 知识库问答 >
问题:

Callable语句-PostgreSQL-多个Out参数

戚飞雨
2023-03-14

我们在PostgreSQL数据库中有一个存储过程,它接受多个输入和多个输出参数。当我们执行以下操作时,来自PG Admin客户端的过程调用可以正常工作,

调用proc1(input1,input2,output1,output2)

但是,如果我们试图通过JDBC CallableStatement进行调用,我们会得到以下错误:,

org.postgresql.util.PSQLException: This statement does not declare an OUT parameter.  Use { ?= call ... } to declare one.
    at org.postgresql.jdbc.PgCallableStatement.registerOutParameter(PgCallableStatement.java:205)

PostgreSQL驱动程序是“org.PostgreSQL.driver”

驱动程序版本是postgressql-42.2.5。罐子

我们如何调用具有来自JDBC的多个输出参数的PostgreSQL过程?

请在下面的代码片段中找到,

public static void main(String args[]) throws SQLException {
        Connection conn = null;
        try {
            String url = "jdbc:postgresql://<<hostname>>:<<port>>/<<DB>>";

            Class.forName("org.postgresql.Driver");
            
            Properties props = new Properties();
            props.setProperty("user", "<<user>>");
            props.setProperty("password", "<<pass>>");
            
            conn = DriverManager.getConnection(url, props);
            CallableStatement cs = conn.prepareCall("call schema.proc1(?,?,?,?)");
            
            cs.setString(1, "test");
            cs.setInt(2, 1000);
            cs.registerOutParameter(3, Types.INTEGER);
            cs.registerOutParameter(4, Types.VARCHAR);
            
            cs.execute();
            
        } catch (Exception e) {
            log.error(e);
        } finally {
            if (conn != null) {
                conn.close();
            }
        }
}

以下是程序的示例版本

Procedure proc1 is (input1 IN varchar2(10), 
      input2 IN number, output1 OUT number, 
      output2 OUT varchar2(10)) IS
BEGIN
output2 := input1;
output1 := input2;
END;

共有1个答案

范甫
2023-03-14

我正在用PostgreSQL 14.1和驱动程序42.2.20在JDBC中测试带有多个OUT参数的过程调用。

必须小心,因为ANSI调用失败

cn.prepareCall("{call proc1(?,?,?,?)}")

使用org.postgresql.util.PSQLExctive: ERROR: Proc1(字符变化,整数)是一个过程提示:要调用过程,请使用CALL。这可能与此答案有关

PostgreSQL调用cn也同样失败。prepareCall(“调用proc1(?,,?,?)”)

catch:org。postgresql。util。PSQLException:错误:整数类型的输入语法无效:“null”。这表明nullintegerOUT参数存在问题。

我终于得到它与一个位黑客定义整数参数为INOUT和传递零。

程序

create or replace PROCEDURE proc1(input1 IN varchar(10), input2 IN integer, output1 INOUT integer, output2 OUT varchar(10))
LANGUAGE plpgsql
AS $$
BEGIN
output2 := input1;
output1 := input2;
END;
$$;

JDBC

// procedure call with two OUT parameter 
stmt = cn.prepareCall("call proc1(?,?,?,?)") 
stmt.setString(1,'x')
stmt.setInt(2,100)
stmt.setInt(3,0)
stmt.registerOutParameter(3,Types.INTEGER)
stmt.registerOutParameter(4,Types.VARCHAR)
stmt.execute()
println  stmt.getInt(3)
println  stmt.getString(4)

回报如期

100
x

 类似资料:
  • 问题内容: 我试图更新一个名为表,并设置为从表。 我在Postgres 9.3中有以下SQL查询,但是当它触发时,出现以下错误: 我更喜欢Active Record,所以我的SQL原始技能严重缺乏。我想知道是否有人可以帮助我向正确的方向指出如何正确执行此查询。 问题答案: 与Postgres中的有效语句相同: 您不能仅将子句中的表别名用作子句中的目标表。要更新的(一个!)表紧跟在关键字之后(如果我

  • 我正在尝试更新一个名为< code>incode_warrants的表,并将< code>warn_docket_no设置为< code>incode_violations表中的< code>viol_docket_no。 我在Postgres 9.3中有以下SQL查询,但当它触发时,我得到以下错误: 我更像是一个主动记录的人,所以我的原始SQL技能严重不足。我想知道是否有人可以帮助我指出正确的方

  • 问题内容: 当表中的列不存在时,为什么此查询会删除所有用户? 初始查询 : 更具体。 IN语句查询返回 : 运行 初始查询 返回 为什么会这样呢? 它是否应该在发生错误时停止执行或返回false或null? 运行PostgreSQL Server 9.0 问题答案: 根据ANSI标准,此行为是正确的。 如果未限定的列名称未在内部作用域中解析,则将考虑外部作用域。因此,您有效地执行了无意关联的子查询

  • 问题内容: 我目前正在制作一份报告,向我显示我们销售团队涵盖的所有邮政编码。 每个团队涵盖100多个邮政编码。我想做的是创建一个报告,将邮政编码内的客户带回去。目前,我的代码如下所示。 我希望的是有一种更快,更轻松的方式来做到这一点。任何建议将不胜感激。有没有一种方法可以为每个销售团队创建变量,例如 只是在钓鱼的想法。干杯 问题答案:

  • 假设我有一个类似下面的函数checkTime,我必须同时检查多个条件。 (上述示例是假设的) 我使用的函数完全有效,但是: 有没有更好的方法、程序或公式来取代这一点?(不必如此冗长或丑陋) Thanx!

  • 有可能做如下事情吗: 或者: 我知道用很多if-else语句也可以实现同样的目标,但如果它像上面那样工作,看起来会更干净。