2016-09-21 9 views
0

Ich habe die folgende PL/SQl-Prozedur (Code unten), und diese Prozedur ruft eine PL/SQL-Funktion von einem Cursor. Der Rückgabetyp dieser Funktion ist jedoch SYS_REFCURSORWie durchlaufen einen Cursor, der einen Ref-Cursor hat

Mein Ziel ist Schleife durch den Cursor und fügen Sie die Datensätze in eine Tabelle ein. Einfach.

Zuerst ist hier die Funktion:

FUNCTION DOB_DIFF (JOB1 NUMBER, JOB2 NUMBER, CASE_NUMBER NUMBER DEFAULT 0) 
RETURN SYS_REFCURSOR IS 

XDO_CURSOR SYS_REFCURSOR; 

BEGIN 
    OPEN XDO_CURSOR FOR 
    'SELECT A.X, 
      A.Y, 
      ''BNFCRY'' AS TYPE, 
      B.Z AS DOB 
    FROM TABLE1 B, TABLE A 
    WHERE B.X = A.X 
    AND B.Y = A.Y'; 

RETURN XDO_CURSOR; 

END DOB_DIFF; 

Hier ist das Verfahren & Was ich habe, so weit:

create or replace PROCEDURE CALL_FUNC1 (USER_ID IN VARCHAR2, JOB_NR1 IN NUMBER, JOB_NR2 IN NUMBER, CASE_NUM NUMBER DEFAULT 0) AS 

CURSOR DOB_DIFF IS 
SELECT PKG_PACKAGE1.DOB_DIFF (JOB_NR1, JOB_NR2, CASE_NUM) FROM DUAL; 

BEGIN 

FOR I IN DOB_DIFF LOOP 
    INSERT INTO IPVOWN.PRT_BEN_DOB_DIFF (X, Y, TYPE, DOB) 
    VALUES (I.X, I.Y, I.TYPE, I.DOB); 
END LOOP; 
COMMIT; 

END CALL_FUNC1; 

ich die folgenden Fehler bekommen, Was mache ich falsch ?? Es scheint, als könnte ich den Cursor nicht durchlaufen, weil der Rückgabewert der Funktion SYS_REFCURSOR ist, was eine Liste ist. Wenn das der Fall ist, wie kann ich dann eine Liste in einem Cursor durchlaufen?

Error(61,2): PLS-00989: Cursor Variable in record, object, or collection is not supported by this release 

Vielen Dank im Voraus.

Antwort

1

Ihr Code muss mehr wie sein:

create or replace procedure call_func1 
    (user_id in varchar2 
    , job_nr1 in number 
    , job_nr2 in number 
    , case_num number default 0 
    ) 
as 
    dob_diff sys_refcursor; 
    dob_diff_rec ipvown.prt_ben_dob_diff%rowtype; 
begin 
    dob_diff := pkg_package1.dob_diff (job_nr1, job_nr2, case_num); 
    loop 
     fetch dob_diff 
      into dob_diff_rec.x 
       , dob_diff_rec.y 
       , dob_diff_rec.type 
       , dob_diff_rec.dob; 

     exit when dob_diff%notfound; 

     insert into ipvown.prt_ben_dob_diff (x, y, type, dob) 
      values (dob_diff_rec.x 
       , dob_diff_rec.y 
       , dob_diff_rec.type 
       , dob_diff_rec.dob 
       ); 
    end loop; 

    close dob_diff; 

end call_func1; 

Sie alles in Großbuchstaben schreiben, wenn Sie wirklich :-)

+0

Dank bevorzugen. Das hat mir geholfen. – AJR