可调用语句 - PostgreSQL - 多个输出参数
Callable Statement - PostgreSQL - Multiple Out Parameters
我们在 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.jar
我们如何从 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;
我正在使用 PostgreSQL 14.1 和驱动程序 42.2.20 在 JDBC 中使用 多个 OUT 参数 测试过程调用。
必须小心,因为 ANSI 调用失败
cn.prepareCall("{call proc1(?,?,?,?)}")
与org.postgresql.util.PSQLException: ERROR: proc1(character varying, integer) is a procedure Hint: To call a procedure, use CALL.
这可能与答案有关
PostgreSQL CALL cn.prepareCall("call proc1(?,?,?,?)")
和
也同样失败
Caught: org.postgresql.util.PSQLException: ERROR: invalid input syntax for type integer: "null"
。这表明 null
integer OUT
参数有问题。
我终于通过一些 hack 将 integer
参数定义为 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)
returns 符合预期
100
x
我们在 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.jar
我们如何从 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;
我正在使用 PostgreSQL 14.1 和驱动程序 42.2.20 在 JDBC 中使用 多个 OUT 参数 测试过程调用。
必须小心,因为 ANSI 调用失败
cn.prepareCall("{call proc1(?,?,?,?)}")
与org.postgresql.util.PSQLException: ERROR: proc1(character varying, integer) is a procedure Hint: To call a procedure, use CALL.
这可能与
PostgreSQL CALL cn.prepareCall("call proc1(?,?,?,?)")
和
Caught: org.postgresql.util.PSQLException: ERROR: invalid input syntax for type integer: "null"
。这表明 null
integer OUT
参数有问题。
我终于通过一些 hack 将 integer
参数定义为 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)
returns 符合预期
100
x