Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Oracle过程的out参数为sys\U refcursor时,何时执行查询(扫描表数据块,读取正确的行)_Java_Oracle_Plsql - Fatal编程技术网

Java Oracle过程的out参数为sys\U refcursor时,何时执行查询(扫描表数据块,读取正确的行)

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

我有一个类似以下签名的过程,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_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()实际访问结果集时
  • 我怀疑这是第一种情况,因为记录在数据库日志表中的时间非常少

    答案是(1)

    它本身实际上会准备结果集。换句话说,查询执行发生在这里

    将从ResultSet中检索行(批量或逐个,基于获取类型)

    您的
    getObject()
    实际上会将Oracle的结果集具体化为JDBC结果集,这类似于执行相同任务的general
    executeQuery()

    优化在
    fetchSize
    处进行。。每次提取的实际行数。。越低的
    fetchSize
    越高的是java和sql之间的往返


    有关

    的更多信息,如果您想了解流程:

  • SQL语句被
    解析
    。它检查语法、语义以及查询是否已经存在于共享池中
  • 如果查询已经存在于共享池中,则进行软解析,否则进行硬解析
  • 然后是
    优化
    阶段。她的执行计划已生成
  • 然后是
    行源代码
    生成。这是生成查询计划的地方
  • 最后,执行查询
  • 而且,为了准确地回答您的问题,所有SQL都作为游标进行解析、存储和执行。因此,您在
    OPEN-FOR
    语句中使用的查询经过上述阶段,最后执行

    你问:

    我的问题是,person_detls的select查询实际上是什么时候 执行(即数据实际上是从表中提取的),如果 从JAVA调用


    PL/SQL是一种过程语言,因此,当调用过程时,执行每一行的标记从一行转到另一行。因此,当OPEN-FOR语句中提到的查询完成上述步骤时,它就是最后执行的时候。

    通常在从游标进行第一次提取时执行。在您的情况下,可能是2或3(我不是Java ist);很可能不是1。甚至这也取决于“执行查询”的含义,因为在Oracle中,执行查询只意味着创建/重新加载执行计划,并为游标结构分配一些内存。通过从游标中获取所有行,您将获得查询的实际性能。我的问题是,从Java的角度来看,查询何时实际执行(答案的第5步)。在执行(OracleResultSet)cst.getObject()或rs.next()时会发生这种情况吗。这里的执行指的是扫描表中相应的行,从物理数据块中选择正确的行,最后我给出了答案。当程序被执行时。此时将执行查询。