2014-05-20 40 views
2

所以我有一個存儲過程ONE聲明SYS_REFCURSOR和ROWTYPE在存儲過程

create or replace PROCEDURE ONE 
(
    A in number 
    B in number 
    ... 
    ZZ out SYS_REFCURSOR 
) IS 
    SOME_OTHER_STUFF 
BEGIN 
    ... 
END 

這將返回了一些數據,我需要一個SYS_REFCURSOR。然後,我有一個存儲過程TWO

create or replace PROCEDURE TWO 
(
    A in number 
    B in number 
    ... 
    ZZ out SYS_REFCURSOR 
) IS 
    Count_Records Sys_Refcursor; 
    l_rec Count_Records%rowtype; 
BEGIN 
    /* get some data from the ONE stored procedure to use on this procedure*/ 
    ONE(A,B,...Count_Records) 

    Loop 
     fetch count_records into l_rec; 
     Exit When count_records%Notfound; 
     If l_rec.TT_RAW > MAX_RECORDS Then 
     Raise To_Many_Results; 
     End If; 
    End Loop; 

END 

我得到一個錯誤,當我嘗試申報行類型l_rec Count_Records%rowtype;

我怎樣才能宣佈這個變量?問題是TT_RAW這是我試圖得到的列是一個SUM和遊標沒有映射到任何表,它包括大量的計算。

感謝

回答

1

可以讀取到的變量列表,而不是,或創建自己的記錄類型:

... 
fetch count_records into v_field1, v_field2, v_field3 
... 
+0

想你的方法和它的工作。感謝您的幫助 – JSantos

5

sys_refcursor整個的一點是,它的動態定義。另一方面,聲明rowtype必須是靜態的(如果不是,編譯器無法判斷從其引用的字段是否有效)。這是一個用例的定義,您應該定義自己的強類型引用遊標,而不是使用sys_refcursor

下面是一個很簡單的例子:

CREATE OR REPLACE PACKAGE BODY rc_example IS 
    PROCEDURE two (a IN NUMBER, b IN NUMBER); 
END rc_example; 
/

CREATE OR REPLACE PACKAGE BODY rc_example IS 
    TYPE one_record IS RECORD (FIRST_VALUE VARCHAR2 (10)); 

    TYPE one_cursor IS REF CURSOR 
     RETURN one_record; 

    --Could alternately be declared using a table's rowtype: 
    --TYPE one_cursor is ref cursor return some_table%rowtype; 

    PROCEDURE one (a IN NUMBER, b IN NUMBER, zz OUT one_cursor) IS 
    BEGIN 
     OPEN zz FOR SELECT 'test' FROM DUAL; 
    END one; 

    PROCEDURE two (a IN NUMBER, b IN NUMBER) IS 
     count_records SYS_REFCURSOR; 
     l_rec count_records%ROWTYPE; 
    BEGIN 
     one (a, b, count_records); 

     LOOP 
     FETCH count_records INTO l_rec; 

     DBMS_OUTPUT.put_line (l_rec.FIRST_VALUE); 
     EXIT WHEN count_records%NOTFOUND; 
     END LOOP; 
    END two; 
END rc_example; 
/
+0

感謝您的好解釋和精心設計的例子。我在另一個爲我工作的答案上使用了這個方法,所以我沒有機會嘗試你的方法,但是下次我需要做一個這樣的程序時會考慮它。最好的祝福 – JSantos