调用返回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
通过preparedStatement = prepareStatement(connection, "select * from emp where emp_number=?", values);
resultSet = preparedStatement.executeQuery();
从
emp
呼叫,上面哪一个是更好的选择? 最佳答案
假设prepareStatement
方法对所有绑定变量使用适当的类型,则性能没有差异。也就是说,根据参数的数据类型,您需要确保正在调用setLong
、setDate
、setString
等。如果数据绑定不正确(即调用setString
绑定数值),则可能会强制Oracle进行数据类型转换,这可能会阻止优化器使用可提高性能的索引。
然而,从代码组织和维护的角度来看,我更希望查询在数据库中,而不是在Java应用程序中。例如,如果您发现查询使用了一个糟糕的计划,那么对于dba来说,如果查询位于存储过程中,那么解决这个问题可能要比将查询嵌入到java应用程序中容易得多。如果查询存储在数据库中,您还可以使用数据库的依赖项跟踪函数来更容易地执行影响分析,如果您需要执行一些操作,例如确定如果emp
表需要更改将影响什么。