如何使用JDBC调用PostgreSQL存储过程

4

我正在使用PostgreSQL,创建了一些存储过程。现在,我想通过JDBC访问这些存储过程并处理结果。这些存储过程的结果要么是整数,要么是一个表格。

我找到了以下资料:

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();

我认为我可以处理单个整数的返回值,但是如何处理表格返回值?

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

6
你需要做的是使用 register 关键字注册所有你想要的返回变量。在提供的代码中,你只注册了第一个 out 参数。
像这样注册前三个参数:
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();
    }
}

参见


问题是如何处理返回结果集的存储过程。 - Craig Ringer

1
处理CallableStatement返回的结果集时,可以像处理一个返回一个或多个ResultSetStatement一样处理它:
ResultSet rs = tableProc.getResultSet();
// ... and loop over the result set just like normal

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接