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
的明显优势是一个更通用的查询,将存储过程视为一个表,我可以在其上使用 WHERE
,JOIN
, ORDER BY
等
我遗漏的方法之间是否存在某些方面或差异?在存储过程用作查询的情况下,推荐使用哪种?
最佳答案
我很确定第二种方法对某些 RDBMS 根本不起作用,但由于您只打算使用 PostgreSQL,所以这应该不会太重要。对于您的简单案例,确实没有太大的缺点。有两个问题我可以看到弹出:
根据存储过程的编写方式,它们可能需要您注册参数才能执行该过程。使用准备好的语句根本不可能做到这一点。如果您同时控制存储过程的创建和调用代码,您可能不必担心这一点。
它首先限制了调用存储过程的有效性。存储过程的主要优点之一是在数据库级别封装查询逻辑。这允许您调整查询或在某些情况下添加功能,而无需更改代码。如果您计划将 where 子句加入到存储过程调用的结果中,为什么不将原始查询放在您的 java 层中呢?
关于postgresql - 作为查询的存储过程 : CallableStatement vs. PreparedStatement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7457477/