gpt4 book ai didi

java - 为什么不能从 JDBC CallableStatement 调用返回 SETOF 的 Postgres 函数?

转载 作者:行者123 更新时间:2023-11-29 11:51:28 24 4
gpt4 key购买 nike

JDBC CallableStatement 不应用于执行返回 SETOF 的 PostgreSQL 存储函数(特别是 REFCURSOR)?

根据 PostgreSQL JDBC documentation :

Functions that return data as a set should not be called via the CallableStatement interface, but instead should use the normal Statement or PreparedStatement interfaces.

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

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

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

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

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

最佳答案

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

所以不会报错,但结果可能不是你想要的。因此警告。

关于java - 为什么不能从 JDBC CallableStatement 调用返回 SETOF 的 Postgres 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44982250/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com