2010-11-11 106 views
4

我有一个现有的存储过程需要2个参数并返回一个oracle光标。光标包含大约30到60行数据。如何从另一个存储过程调用存储过程oracle

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

例如:

SP 1 = get_data_1 (returns oracle cursor) 
SP 2 = get_data_2 

在get_data_2

select count(*) from get_data_1 (pass_input_parms) A where A.ID = '12345' 

概念上,它似乎是一个微不足道的事情但是对我做什么,是新来的甲骨文世界,我不知道如何使用先前存在的返回游标的存储过程。

我该怎么做?

回答

5

您不能在后续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 
+0

谢谢,这是有道理的。虽然循环似乎效率低下。你可以指出的任何优秀资源都显示了如何制作流水线功能,然后在另一个SP中使用它们? – Reeth 2010-11-11 15:51:41

+0

@Reeth - 添加了使用流水线表函数的快速演示。 – 2010-11-11 20:12:09

0

在这一点上,你还不如定义一个新包,并学习如何使用游标循环处理这个它会给你更多的程序控制。 PL/SQL是你需要查找的。

相关问题