在调用返回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
拨打的更好选择?
答案 0 :(得分:1)
假设您的prepareStatement
方法对所有绑定变量使用适当的类型,则没有性能差异。也就是说,您需要确保调用setLong
,setDate
,setString
等,具体取决于参数的数据类型。如果您错误地绑定数据(即调用setString
来绑定数值),您可能会强制Oracle进行数据类型转换,这可能会阻止优化器使用可提高性能的索引。
但是,从代码组织和维护的角度来看,我宁愿在数据库中而不是在Java应用程序中使用查询。例如,如果您发现查询使用的计划不佳,则如果查询位于存储过程中,则DBA可能更容易解决问题,而不是查询嵌入Java应用程序中。如果查询存储在数据库中,您还可以使用数据库的依赖关系跟踪功能,以便在需要执行某些操作时更轻松地执行影响分析,以确定emp
表需要更改时会受到什么影响。 / p>
答案 1 :(得分:1)
好吧,我认为与 Java调用的观点没有重大区别。
我能想到的一些差异是: