调用返回SYS_RECURSOR
的过程是否有任何性能改进?或调用查询?
例如
CREATE OR REPLACE PROCEDURE my_proc
(
p_id number,
emp_cursor IN OUT SYS_REFCURSOR
)
AS
BEGIN
OPEN emp_cursor for
select * from emp where emp_number=p_id
end;
/
并从Java
调用上面的内容通过注册OUT
参数,传递IN
参数并获取结果。
或者
来自 Java
从 emp
获取结果table
通过
preparedStatement = prepareStatement(connection, "select * from emp where emp_number=?", values);
resultSet = preparedStatement.executeQuery();
以上哪一个是从 Java
调用电话的更好选择?
最佳答案
假设您的 prepareStatement
方法对所有绑定(bind)变量使用适当的类型,则不会有性能差异。也就是说,您需要确保根据参数的数据类型调用 setLong
、setDate
、setString
等。如果您错误地绑定(bind)数据(即调用setString
来绑定(bind)数值),您可能会强制Oracle进行数据类型转换,这可能会阻止优化器使用可以提高性能的索引。
但是,从代码组织和维护的角度来看,我宁愿在数据库中而不是在 Java 应用程序中进行查询。例如,如果您发现某个查询使用了糟糕的计划,那么如果该查询位于存储过程中,那么 DBA 解决该问题可能比该查询嵌入在 Java 应用程序中容易得多。如果查询存储在数据库中,您还可以使用数据库的依赖项跟踪功能更轻松地进行影响分析(如果您需要执行诸如确定 emp
表需要时会受到影响之类的操作)改变。
关于java - 从数据库表中获取结果的更好选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10971686/