确定Oracle填充游标所需的时间

时间:2013-10-11 01:58:06

标签: sql plsql oracle10g cursor oracle-sqldeveloper

我正在尝试评估存储过程的性能,我正在尝试在SQL Developer工作表中运行它。基本思路是:

DECLARE
some_cursor SYS_REFCURSOR;
...
BEGIN

dbms_output.put_line('BEGIN: ' || TO_CHAR(CURRENT_TIMESTAMP, 'DD-MON-YYYY HH12:MI:SSxFF TZH:TZM'));

OPEN some_cursor FOR (...);

dbms_output.put_line('END: ' || TO_CHAR(CURRENT_TIMESTAMP, 'DD-MON-YYYY HH12:MI:SSxFF TZH:TZM'));

END;

两个时间戳都是一样的;我假设这是因为调用OPEN some_cursor FOR只会启动选择。

有没有办法阻止原始线程,直到光标被填满?

1 个答案:

答案 0 :(得分:2)

从你的问题标题,“......填充光标”,

oracle的

cursor可以作为指针,

从定义来看: 游标是私有SQL区域的句柄或名称 - 内存中包含已解析语句和其他信息以供处理的区域。

这将更好地解释:OraFAQ

稍作修改:来自:here

set serveroutput on
DECLARE 
  l_cur SYS_REFCURSOR; 
  l_col VARCHAR2 (10); 
BEGIN 


  OPEN l_cur FOR 
  SELECT 'Hi there'||LEVEL col 
      from dual 
      where 1 = 1
      CONNECT BY LEVEL <= 20; 

  DBMS_OUTPUT.PUT_LINE('Opened cursor'); 

dbms_output.put_line('BEGIN: ' || TO_CHAR(CURRENT_TIMESTAMP, 'DD-MON-YYYY HH12:MI:SSxFF TZH:TZM'));
  <<cursor_loop>>

  loop

    fetch l_cur into l_col; 
    DBMS_OUTPUT.PUT_LINE('Fetched from cursor'); 

    EXIT cursor_loop WHEN l_cur%NOTFOUND;

    DBMS_OUTPUT.PUT_LINE('Process data fetched from cursor');    
  end loop;  -- cursor_loop
dbms_output.put_line('END: ' || TO_CHAR(CURRENT_TIMESTAMP, 'DD-MON-YYYY HH12:MI:SSxFF TZH:TZM'));
  CLOSE l_cur; 
  dbms_output.put_line('Closed cursor');
end; 
/