【问题标题】:stored procedures as queries: CallableStatement vs. PreparedStatement作为查询的存储过程:CallableStatement 与 PreparedStatement
【发布时间】:2011-11-19 10:12:21
【问题描述】:

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

对于返回rowset的存储过程,使用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 等。

我缺少的方法之间是否存在方面或差异?在存储过程用作查询的情况下,推荐哪种方式?

【问题讨论】:

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


    【解决方案1】:

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

    假设你是一个Java程序员,你不知道如何使用数据库,这样你就不能使用第二种方法,你会遇到第二种方法的问题。

    第一种方法允许您编写 java 代码,并要求某人为您编写查询作为存储过程,因此您可以轻松使用它们。

    我同意@dlawrence

    【讨论】:

      【解决方案2】:

      我很确定第二种方法根本不适用于某些 RDBMS,但由于您只打算使用 PostgreSQL,所以这无关紧要。对于您的简单情况,确实没有太大的缺点。我可以看到两个问题:

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

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

      【讨论】:

        猜你喜欢
        • 2012-01-12
        • 2013-09-13
        • 2010-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-11
        相关资源
        最近更新 更多