有没有一种方法可以在阅读后关闭光标



使用oracle sql和oracle服务总线。我在关闭连接时遇到问题。我使用的一个简单程序示例如下:

create or replace procedure getempdata(
v_id in number,
q out sys_refcursor
)
as
begin
open q for select * from employees where id = v_id;
end;

我需要一种方法,在从中获取数据后关闭光标。但是如果我使用close Q;,我就无法读取服务总线适配器中返回的数据。问题是:有没有办法在读取光标后从服务总线关闭光标(用于内存管理(?如果没有,有没有办法从返回数据作为输出的过程中做到这一点?

注意:我不从sql代码中调用该过程,所以我可以关闭它。我使用服务总线Web服务将其作为Web服务调用,该服务通过数据库适配器调用该过程;所以我需要在服务总线中返回数据

您可以从调用方关闭它。

您的程序(根据Scott的示例模式进行了调整(:

SQL> create or replace procedure getempdata(
2    v_id in number,
3    q out sys_refcursor
4  )
5  as
6  begin
7    open q for select ename from emp where deptno = v_id;
8  end;
9  /
Procedure created.

我们称之为

SQL> set serveroutput on
SQL> declare
2    l_rc sys_refcursor;
3    l_ename emp.ename%type;
4  begin
5    getempdata(10, l_rc);             --> procedure is called here
6    loop
7      fetch l_rc into l_ename;
8      exit when l_rc%notfound;
9      dbms_output.put_line(l_ename);
10    end loop;
11    close l_rc;                       --> cursor is closed here
12  end;
13  /
CLARK
KING
MILLER
PL/SQL procedure successfully completed.
SQL>

是的,一旦您使用CLOSE语句从中读取(或者如果发生异常阻止从中读取(,就关闭它。

DECLARE
v_cur SYS_REFCURSOR;
v_row EMPLOYEES%ROWTYPE;
BEGIN
-- call the procedure
getempdata(1, v_cur);
-- read the rows
LOOP
FETCH v_cur INTO v_row;
EXIT WHEN v_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_row.id);
END LOOP;

-- close the cursor
CLOSE v_cur;
EXCEPTION
WHEN OTHERS THEN -- Handling OTHERS is bad practice, normally you should be more specific
IF v_cur%ISOPEN THEN
CLOSE v_cur;
END IF;
END;
/

小提琴

相关内容

最新更新