3

CallableStatement为什么不应该使用 JDBC 来执行返回SETOF(特别是)的 PostgreSQL 存储函数,是否有技术原因REFCURSOR

根据PostgreSQL JDBC 文档

不应通过 CallableStatement接口调用以集合形式返回数据的函数,而应使用普通的语句或PreparedStatement接口。

除此之外,我还没有看到任何原因、性能、错误相关或其他原因,为什么你不应该这样做,而且它似乎确实有效。它似乎从本质上限制了您可以使用某些函数(尤其是那些返回多个结果集的函数)执行的操作,并且在将过程从另一个数据库移植到 PostgreSQL 时有点强加。

我对忽略发布该软件的组织的公然警告持怀疑态度,但我很想知道更具体的原因。我确实意识到游标和结果集的处理方式与一次从服务器传输到客户端的数据量不同,但这已经被记录为一个缺点。

更新为函数实现的 PostgreSQLCallableStatement将调用字符串的格式转换为选择语句。因此,返回 a 的函数SETOF(以及所有函数)的 JDBC 执行的处理方式与使用PreparedStatement.

JDBCCallableStatementPreparedStatement可以处理输出参数的。因为返回 a 的 PostgreSQL 函数SETOF不能包含输出参数,所以 aCallableStatement不为此类函数提供任何附加功能。话虽如此,PostgreSQL 文档并不反对使用CallableStatement不包含输出参数的 for 函数,而且目前似乎没有任何技术原因说明为什么CallableStatement不应该使用 a。

我的一位同事指出,这个警告已经存在很长时间了,所以它似乎是一个设计决定,而不是一个错误。虽然CallableStatement目前可以工作(我怀疑会继续工作),但不能保证将来会继续这样做,特别是如果这是一个设计决策。

4

1 回答 1

0

如果您尝试使用 aCallableStatement来检索表函数的结果,您将只能获得第一个结果行。

所以它不会导致错误,但结果可能不是你想要的。因此发出警告。

于 2017-07-10T10:01:31.793 回答