是否有技术原因不应该使用JDBC CallableStatement来执行返回SETOF (特别是REFCURSOR)的PostgreSQL存储函数?
不应该通过
CallableStatement接口调用作为集合返回数据的函数,而应该使用普通语句或PreparedStatement接口。
除此之外,我还没有看到任何原因,性能,与bug相关的,或者其他原因,为什么您不应该这样做,而且它看起来确实有效。它似乎内在地限制了您可以使用某些函数(特别是那些返回多个结果集的函数)所能做的事情,并且在将过程从另一个数据库移植到PostgreSQL时会受到一些限制。
我对忽略发布此软件的组织发出的公然警告持怀疑态度,但我好奇地想知道更具体的原因。我确实认识到,游标和结果集在一次尝试中从服务器传输到客户端的数据量不同,但这已经被记录为一个缺点。
UPDATE函数的PostgreSQL实现了CallableStatement,将调用字符串的格式转换为select语句。因此,返回SETOF (以及所有函数)的函数的JDBC执行与使用PreparedStatement的方式相同。
JDBC CallableStatement是可以处理输出参数的PreparedStatement。因为返回PostgreSQL函数的SETOF不能包含输出参数,所以CallableStatement不为这些函数提供任何附加功能。尽管如此,PostgreSQL文档并没有阻止对不包括输出参数的函数使用CallableStatement,而且目前似乎没有任何技术原因说明为什么不应该使用CallableStatement。
我的一位同事指出,这一警告已经存在了很长时间,因此它似乎是一个设计决定,而不是一个错误。虽然CallableStatement目前正在工作(我怀疑它将继续工作),但不能保证它将来会继续工作,特别是如果这是一个设计决定的话。
发布于 2017-07-10 10:01:31
如果尝试使用CallableStatement检索表函数的结果,则只会得到第一个结果行。
因此,它不会导致错误,但结果可能不是您想要的。因此发出了警告。
https://stackoverflow.com/questions/44982250
复制相似问题