在过去的几天里,我查看了其他人的代码并发现有很多PL / SQL函数返回REF CURSOR。然后使用CallableStatement在Java中调用这些函数。
例如,可能在PL / SQL中定义了一个函数:
public Builder startDate(String startDate) {
// validate startDate here using checkArgument if it is not valid then throw IllegalArgumentException.
this.sDate = startDate;
return this;
}
在Java中:
FUNCTION FOO(a NUMBER) RETURN REF CURSOR IS
与第二种方法相比 - 使用Java进行查询,不涉及PL / SQL,我可以在两种方法中看到专家:
说了上面的话,忽略了开发团队的技能,是否会有任何性能差异,网络带宽差异?您可以分享的任何见解和/或经验?
答案 0 :(得分:0)
我认为这取决于应用程序在while (resultSet.next())
循环中执行的操作。例如,如果您在Oracle和客户端之间来回传递,则引用游标将是有益的。
如果客户端提取所有行,我宁愿选择不同的解决方案 - 重写函数以便返回对象集合,并在客户端使用TABLE
函数(例如SELECT * FROM TABLE(Foo(1))
) 。它可能适用于您,也可能不适用(例如,如果您有其他PL / SQL程序/功能真正受益于使用REF CURSOR)。
此外,可能值得尝试隐式语句结果(http://docs.oracle.com/database/121/LNPLS/release_changes.htm#LNPLS118) -
从Oracle Database 12c开始,PL / SQL存储的子程序可以返回查询 使用PL / SQL包DBMS_SQL隐式地向客户端发送结果 而不是OUT REF CURSOR参数。这种技术使其变得容易 迁移依赖于隐式返回查询结果的应用程序 从存储的子程序,从第三方数据库到Oracle数据库