您不能在後續SQL語句中重複使用來自get_data_1的REF CURSOR,因爲它只是一個指向語句句柄的指針。遊標本身不包含數據。
你可以做類似
CREATE PROCEDURE get_data_2(p_cnt OUT NUMBER)
AS
l_rc <<your cursor type>>;
l_rec <<the type your cursor returns>>;
BEGIN
get_data_1(<<parameter 1>>, <<parameter 2>>, l_rc);
p_cnt := 0;
LOOP
FETCH l_rc INTO l_rec;
EXIT WHEN l_rc%NOTFOUND;
IF(l_rec.id = '12345')
THEN
p_cnt := p_cnt + 1;
END IF;
END LOOP;
CLOSE l_rc;
END;
正如你可能想象,不過,這往往會老去相對較快。鑑於此,除非您將完成的數據視圖返回給客戶端應用程序,否則在Oracle中往往不存在返回REF CURSOR參數的存儲過程。例如,如果存在共享視圖,則GET_DATA_1和GET_DATA_2都可以查詢而不是讓GET_DATA_2調用GET_DATA_1,這將簡化程序。如果GET_DATA_1是一個流水線表函數而不是返回REF CURSOR的過程,那麼從GET_DATA_2調用GET_DATA_1會容易得多。
如果你想開始使用流水線表函數(使用SCOTT模式)
create or replace type emp_obj as object (
empno number,
ename varchar2(10),
job varchar2(9),
mgr number,
hiredate date);
/
create type emp_tbl
as
table of emp_obj;
/
create function emp_pipe(p_deptno IN NUMBER)
return emp_tbl pipelined
is
begin
FOR x IN (SELECT * FROM emp WHERE deptno = p_deptno)
LOOP
PIPE ROW(emp_obj(x.empno,
x.ename,
x.job,
x.mgr,
x.hiredate));
END LOOP;
END;
/
SQL> select * from table(emp_pipe(10));
EMPNO ENAME JOB MGR HIREDATE
---------- ---------- --------- ---------- ---------
7782 CLARK MANAGER 7839 09-JUN-81
7839 KING PRESIDENT 17-NOV-81
7934 MILLER CLERK 7782 23-JAN-82
謝謝,這是有道理的。雖然循環似乎效率低下。你可以指出的任何優秀資源都顯示瞭如何製作流水線功能,然後在另一個SP中使用它們? – Reeth 2010-11-11 15:51:41
@Reeth - 添加了使用流水線表函數的快速演示。 – 2010-11-11 20:12:09