使用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;
/
小提琴