Java Oracle过程的out参数为sys\U refcursor时,何时执行查询(扫描表数据块,读取正确的行)
我有一个类似以下签名的过程,Java前端正在调用该过程:Java Oracle过程的out参数为sys\U refcursor时,何时执行查询(扫描表数据块,读取正确的行),java,oracle,plsql,Java,Oracle,Plsql,我有一个类似以下签名的过程,Java前端正在调用该过程: PROCEDURE MY_PROCEDURE ( in_id IN VARCHAR2, in_cd IN VARCHAR2, person_detls OUT r_cursor, ) IS begin v_start_time := DBMS_UTILITY.GET_TIME; open person
PROCEDURE MY_PROCEDURE (
in_id IN VARCHAR2,
in_cd IN VARCHAR2,
person_detls OUT r_cursor,
)
IS
begin
v_start_time := DBMS_UTILITY.GET_TIME;
open person_detls for
**some complex select query here**
;
v_end_time := DBMS_UTILITY.GET_TIME;
v_time_taken := v_end_time - v_start_time;
logging_pkg.write_to_log_table('MY_PROCEDURE',v_time_taken );
END;
我的问题是:
如果从JAVA调用person_detls的select查询,则该查询何时实际执行(即数据实际上从表中获取):
CallableStatement.execute()代码>
rs从CallableStatement中提取resultset时=
(OracleResultSet)cst.getObject()代码>
rs.next()实际访问结果集时
getObject()
实际上会将Oracle的结果集具体化为JDBC结果集,这类似于执行相同任务的generalexecuteQuery()
优化在fetchSize
处进行。。每次提取的实际行数。。越低的fetchSize
越高的是java和sql之间的往返
有关的更多信息,如果您想了解流程:
解析
。它检查语法、语义以及查询是否已经存在于共享池中优化
阶段。她的执行计划已生成行源代码
生成。这是生成查询计划的地方
OPEN-FOR
语句中使用的查询经过上述阶段,最后执行
你问:
我的问题是,person_detls的select查询实际上是什么时候
执行(即数据实际上是从表中提取的),如果
从JAVA调用
PL/SQL是一种过程语言,因此,当调用过程时,执行每一行的标记从一行转到另一行。因此,当OPEN-FOR语句中提到的查询完成上述步骤时,它就是最后执行的时候。通常在从游标进行第一次提取时执行。在您的情况下,可能是2或3(我不是Java ist);很可能不是1。甚至这也取决于“执行查询”的含义,因为在Oracle中,执行查询只意味着创建/重新加载执行计划,并为游标结构分配一些内存。通过从游标中获取所有行,您将获得查询的实际性能。我的问题是,从Java的角度来看,查询何时实际执行(答案的第5步)。在执行(OracleResultSet)cst.getObject()或rs.next()时会发生这种情况吗。这里的执行指的是扫描表中相应的行,从物理数据块中选择正确的行,最后我给出了答案。当程序被执行时。此时将执行查询。