Вы не можете повторно использовать REF CURSOR из get_data_1 в последующем операторе SQL, потому что это просто указатель на дескриптор оператора.Сам курсор не содержит данных.
Вы можете сделать что-то вроде
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_1 из GET_DATA_2.
Если вы хотите начать работу с конвейерными табличными функциями (используя схему 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