13

PostgreSQL documentation建议使用CallableStatement来调用存储过程。作为查询的存储过程:CallableStatement vs. PreparedStatement

在返回行集的存储过程的情况下,有什么用CallableStatement之间的差异:

String callString = "{ call rankFoos(?, ?) }"; 
CallableStatement callableStatement = con.prepareCall(callString); 
callableStatement.setString(1, fooCategory); 
callableStatement.setInt(2, minimumRank); 
ResultSet results = statement.executeQuery(); 

,并使用常规PreparedStatement

String queryString = "SELECT FooUID, Rank FROM rankFoos(?, ?);"; 
PreparedStatement preparedStatement = connection.prepareStatement(queryString); 
preparedStatement.setString(1, fooCategory); 
preparedStatement.setInt(2, minimumRank); 
ResultSet results = statement.executeQuery(); 

据我了解,CallableStatement报价一种与语言无关的调用存储过程的方法。这对我来说并不重要,因为我知道我在使用PostgreSQL。据我所看到的,使用PreparedStatement的明显优势是更通用的查询,处理存储过程作为一个表,关于这一点我可以用WHEREJOINORDER BY

是否有问题或分歧我错过了哪些方法?在作为查询使用存储过程的情况下,推荐使用?

回答

12

我敢肯定,第二种方法根本不适用于某些RDBMS,但由于您只打算使用PostgreSQL,所以不应该太重要。对于你的简单情况,真的没有太大的缺点。这里有两个问题,我可以看到弹出:

  1. 根据存储过程是如何写的,他们可能会要求您以执行的程序进行注册out参数。准备好的声明完全不可能。如果你同时控制存储过程和调用代码的创建,你可能不必担心这一点。

  2. 它首先限制了调用存储过程的有效性。存储过程的一个主要优点是将查询逻辑封装在数据库级别。这使您可以调整查询或在某些情况下添加功能,而无需更改代码。如果您打算在where子句中加入存储过程调用的结果,为什么不把原始查询放在java层?

7

的主要区别是独立和编程的封装方式。

想象一下,您是一名Java程序员,您不知道如何使用数据库,这样您就无法使用第二种方法,并且您将以第二种方式解决问题。

第一种方法可以让你做你的java代码,并要求有人把你的quires写为Stored-Procedure,所以你可以很容易地使用它们。

我同意@dlawrence

+0

良好的洞察力。谢谢! –