Java 为什么可以';返回SETOF的Postgres函数是否可以从JDBC CallableStatement调用?

Java 为什么可以';返回SETOF的Postgres函数是否可以从JDBC CallableStatement调用?,java,postgresql,jdbc,multiple-resultsets,Java,Postgresql,Jdbc,Multiple Resultsets,JDBCCallableStatement不应用于执行返回集合的PostgreSQL存储函数(特别是REFCURSOR)是否有技术原因 根据: 不应通过调用以集合形式返回数据的函数 CallableStatement接口,但应使用普通 语句或PreparedStatement接口 除此之外,我还没有看到任何原因、性能、bug相关或其他原因,以及您不应该这样做的原因,而且它看起来确实有效。它似乎从本质上限制了您对某些函数(尤其是那些返回多个结果集的函数)所能做的事情,并且在将过程从另一个数据库移植

JDBC
CallableStatement
不应用于执行返回
集合的PostgreSQL存储函数(特别是
REFCURSOR
)是否有技术原因

根据:

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

除此之外,我还没有看到任何原因、性能、bug相关或其他原因,以及您不应该这样做的原因,而且它看起来确实有效。它似乎从本质上限制了您对某些函数(尤其是那些返回多个结果集的函数)所能做的事情,并且在将过程从另一个数据库移植到PostgreSQL时有点强加

我对无视发布此软件的组织发出的公然警告持谨慎态度,但我想知道更具体的原因。我确实意识到,游标和结果集在单次从服务器传输到客户端的数据量方面是不同的,但这已经被证明是一个缺点

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

JDBC
CallableStatement
是可以处理输出参数的
PreparedStatement
。因为返回
集合的PostgreSQL函数不能包含输出参数,
CallableStatement
不会为此类函数提供任何附加功能。尽管如此,PostgreSQL文档并没有阻止对不包含输出参数的函数使用
CallableStatement
,目前似乎也没有任何技术原因说明为什么不应该使用
CallableStatement


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

如果尝试使用
CallableStatement
检索表函数的结果,则只会得到第一个结果行


因此,它不会导致错误,但结果可能不是您想要的。因此,警告。

看起来你最近的编辑更多的是试图回答你自己的问题,考虑把它作为答案来回答。我确实考虑把它作为答案,但是最终它没有解决警告背后的原因,这是一个技术上的原因。