postgresql - 作为查询的存储过程 : CallableStatement vs. PreparedStatement

标签 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, ORDER BY

我遗漏的方法之间是否存在某些方面或差异?在存储过程用作查询的情况下,推荐使用哪种?

最佳答案

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

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

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

关于postgresql - 作为查询的存储过程 : CallableStatement vs. PreparedStatement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7457477/

相关文章:

postgresql - 在 plpgsql 触发器函数中用 "array_to_string"填充变量

java - 如果基于事务,则插入更多记录时出现问题

sql - 为什么此存储过程适用于一个查询而不适用于另一查询?

java - Spring JDBC。插入具有一对多关系的记录

java - 错误: Client does not support authentication protocol requested by server; consider upgrading MySQL client

java - 如何在 java/JDBC 中取消 postgres 查询

node.js - 由于使用sequelize.js 的 UUID 外键而尝试将行插入表时出错

MySql判断字符串列表中的所有元素是否存在于其他字符串列表中

mySQL:存储过程比查询更安全?

java - 如何从结果集中获取最小计数、最大计数和总结果集计数