如何从oracle中的另一个存储过程调用存储过程

如何从oracle中的另一个存储过程调用存储过程,oracle,stored-procedures,plsql,Oracle,Stored Procedures,Plsql,我有一个现有的存储过程,它接受2个参数并返回一个oracle游标。光标包含大约30到60行数据 我想在另一个存储过程中使用上述预先存在的存储过程作为表…基本上我想调用预先存在的存储过程,看看返回的行是否包含特定的值 例如: SP 1 = get_data_1 (returns oracle cursor) SP 2 = get_data_2 在get_数据_2中 select count(*) from get_data_1 (pass_input_parms) A where A.ID =

我有一个现有的存储过程,它接受2个参数并返回一个oracle游标。光标包含大约30到60行数据

我想在另一个存储过程中使用上述预先存在的存储过程作为表…基本上我想调用预先存在的存储过程,看看返回的行是否包含特定的值

例如:

SP 1 = get_data_1 (returns oracle cursor)
SP 2 = get_data_2 
在get_数据_2中

select count(*) from get_data_1 (pass_input_parms) A where A.ID = '12345'
从概念上讲,这对我来说似乎是一件小事,但是,作为oracle世界的新手,我不知道如何使用返回游标的现有存储过程


如何执行此操作?

您不能在后续SQL语句中重用get_data_1中的REF游标,因为它只是指向语句句柄的指针。光标本身不包含任何数据

你可以这样做

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;

此时,您还可以定义一个新的包,并学习如何使用游标循环来处理这个问题,它将为您提供更多的编程控制。PL/SQL是您需要查找的内容。

谢谢,这很有意义。尽管循环似乎效率低下。您能找到的任何好的资源都显示了如何制作流水线函数,然后在另一个SP中使用它们?@Reeth-添加了一个使用流水线表函数的快速演示。
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