存储过程作为查询:CallableStatement与PreparedStatement

时间:2011-09-17 20:11:45

标签: postgresql stored-procedures jdbc prepared-statement callable-statement

PostgreSQL documentation建议使用CallableStatement来调用存储过程。

对于返回行集的存储过程,使用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的明显优势是一个更通用的查询,将存储过程视为一个表,我可以使用WHEREJOIN,{ {1}}等等。

我缺少的方法之间是否存在方面或差异?如果存储过程用作查询,建议使用?

2 个答案:

答案 0 :(得分:12)

我很确定第二种方法对某些RDBMS不起作用,但由于你只是要使用PostgreSQL,这应该不会太重要。对于你的简单案例,确实没有太大的缺点。我可以看到弹出的两个问题:

  1. 根据存储过程的编写方式,可能需要注册参数才能执行该过程。准备好的陈述完全不可能。如果您同时控制存储过程的创建和调用代码,您可能不必担心这一点。

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

答案 1 :(得分:7)

主要区别在于独立性和封装的编程方式。

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

第一种方法允许你做你的java代码,并要求有人把你的quires写成Stored-Procedure,所以你可以轻松使用它们。

我同意@dlawrence