【问题标题】:How to call PostgreSQL stored procedures with JDBC如何使用 JDBC 调用 PostgreSQL 存储过程
【发布时间】:2014-11-24 10:52:31
【问题描述】:

我正在使用 postgresql,并且我创建了一些存储过程。现在我想通过 jdbc 访问存储过程并处理结果。存储过程的结果是整数或 TABLE。

我发现了以下内容:

CallableStatement upperProc = conn.prepareCall("{ ? = call upper( ? ) }");
upperProc.registerOutParameter(1, Types.VARCHAR);
upperProc.setString(2, "lowercase to uppercase");
upperProc.execute();
String upperCased = upperProc.getString(1);
upperProc.close();

有了这个,我想我可以处理单个整数返回,但是如何处理 TABLE 返回?

【问题讨论】:

  • 你不需要CallableStatement。对返回标量的函数使用PreparedStatement.executeQuery() 和select upper(?),对返回表的函数使用select * from foo(?)。
  • 请不要混淆其他人-upper() 是postgresql 中的一个函数,而不是一个过程

标签: java postgresql stored-procedures jdbc


【解决方案1】:

您需要做的是注册您希望使用的所有返回变量。在提供的代码中,您只注册了第一个输出参数。

这样的东西注册了前 3 个:

String callableSQL = "{call upper(?)}";

try {
    dbConnection = getDBConnection();
    callableStatement = dbConnection.prepareCall(callableSQL);

    callableStatement.setString(1, "lowercase to uppercase");

    //register multiple output parameters to match all return values
    callableStatement.registerOutParameter(1, java.sql.Types.VARCHAR);
    callableStatement.registerOutParameter(2, java.sql.Types.VARCHAR);
    callableStatement.registerOutParameter(3, java.sql.Types.XYZ);  //any data type here

    callableStatement.execute();

    //do something with your return values
    String xyz = callableStatement.getString(1);
    //... for other items you have registered.

} catch (SQLException up) {
    throw up;  //haha!
} finally {
    //Silently close off
    if (callableStatement != null) {
        callableStatement.close();
    }

    if (dbConnection != null) {
        dbConnection.close();
    }
}

另见

【讨论】:

  • 问题在于如何处理返回结果集的 proc。
【解决方案2】:

要处理来自CallableStatement 的结果集,请将其视为返回一个或多个ResultSets 的Statement:

ResultSet rs = tableProc.getResultSet();
// ... and loop over the result set just like normal

(如果返回SETOF REFCURSOR,PostgreSQL 函数可以返回多个结果集)。

【讨论】:

    猜你喜欢
    • 2016-06-20
    • 2020-01-24
    • 2015-05-28
    • 2016-01-08
    • 2021-09-02
    • 2016-05-03
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    相关资源
    最近更新 更多