如何使用 JDBC 调用 PostgreSQL 存储过程
Posted
技术标签:
【中文标题】如何使用 JDBC 调用 PostgreSQL 存储过程【英文标题】:How to call PostgreSQL stored procedures with JDBC 【发布时间】: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 中的一个函数,而不是一个过程
【参考方案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();
另见
JDBC CallableStatement – Stored Procedure OUT Parameter Example postgresql with jdbc and stored procedures (functions): ResultSet Using JDBC CallableStatements to Execute Stored Procedures Calling Stored Procedures in Java DB and mysql【讨论】:
问题在于如何处理返回结果集的 proc。【参考方案2】:要处理来自CallableStatement
的结果集,请将其视为返回一个或多个ResultSet
s 的Statement
:
ResultSet rs = tableProc.getResultSet();
// ... and loop over the result set just like normal
(如果返回SETOF REFCURSOR
,PostgreSQL 函数可以返回多个结果集)。
【讨论】:
以上是关于如何使用 JDBC 调用 PostgreSQL 存储过程的主要内容,如果未能解决你的问题,请参考以下文章
如何做批处理 jdbc/insert!和 jdbc/更新!在 Clojure 中使用 postgresql?
如何使用 jdbc/spring-jdbc 不使用 PGInterval 对 PostgreSQL 区间数据类型进行操作?