0

我正在尝试评估存储过程的性能,并尝试在 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只会启动选择。

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

4

1 回答 1

2

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

cursor 因为 oracle 可以表示为指针,

根据定义: 游标是私有 SQL 区域的句柄或名称——内存中保存已解析语句和其他信息以供处理的区域。

这将更好地解释:OraFAQ

稍作修改:来自:这里

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; 
/
于 2013-10-11T04:47:13.470 回答