【问题标题】:Why can't Postgres functions that return SETOF be called from a JDBC CallableStatement?为什么不能从 JDBC CallableStatement 调用返回 SETOF 的 Postgres 函数?
【发布时间】:2017-12-12 10:18:03
【问题描述】:

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

根据PostgreSQL JDBC documentation

不应通过 CallableStatement 接口,但是应该使用普通的 声明或PreparedStatement接口。

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

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

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

一个 JDBC CallableStatement 是一个可以处理输出参数的PreparedStatement。因为返回 SETOF 的 PostgreSQL 函数不能包含输出参数,所以 CallableStatement 不为此类函数提供任何附加功能。话虽如此,PostgreSQL 文档并不反对将 CallableStatement 用于不包含输出参数的函数,而且目前似乎没有任何技术原因可以解释为什么应该使用 CallableStatement '不被使用。

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

【问题讨论】:

  • 看起来您最近的编辑更像是在尝试回答您自己的问题,请考虑将其作为答案发布。
  • 我确实考虑过发布这个作为答案,但最终它并没有解决警告背后的原因,而这个原因是技术原因。

标签: java postgresql jdbc multiple-resultsets


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2012-06-30
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 2013-07-25
    • 2019-09-13
    • 1970-01-01
    相关资源
    最近更新 更多