2010-11-11 142 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是你需要查找的。

相關問題