2017-07-23 1 views
0

Brauchen Sie Hilfe.Wie speichert man das Ergebnis einer Funktion, die sysrefcursor zurückgibt?

Szenario: Es gibt eine Prozedur, in der wir einen Cursor haben. Ich muss eine Funktion aufrufen, die eine Eingabe von diesem Cursorwert nimmt und SYS_REFCURSOR zurückgibt.

Ich muss dieses Ergebnis der Funktion in einer anderen Variablen speichern/Cursor & muss diesen Wert aus der Prozedur als out-Parameter zurückgeben.

Ich benutze Orakel 11g.

Bitte helfen! Wie ich vorgehen werde?

PFB Mein Ansatz:

create or replace procedure prc_test 
    (p_dept_id in number, 
    c_detail out sysrefcursor)--need to add extra out parameter 
as 
    var1 varchar2(200) :=null; 

begin 
    open c_detail for 
    select -1 from dual; 
    if p_dept_id is not null then 
    open c_detail for 
     select emp_no from emp 
      where dept_id=p_dept_id;  
    --i need to retrn value of 'get_emp_dtls' function as out parameter. 
    end if; 

end procedure; 
/

Funktion zu

CREATE OR REPLACE FUNCTION get_emp_dtls 
    (p_emp_no IN EMP.EMP_NO%TYPE) 
    RETURN SYS_REFCURSOR 
AS 
    o_cursor SYS_REFCURSOR; 
BEGIN 
    OPEN o_cursor FOR 
     SELECT 
     ENAME, 
     JOB    
     FROM emp 
     WHERE EMP_NO = p_emp_no; 
    RETURN o_cursor; 
    -- exception part 
END; 
/
+0

Was hast du bisher gemacht? Bitte zeigen Sie Ihren Code. – MKR

+1

Wie alle anderen Datentypen: 'somevar: = somefunction();' Was funktioniert nicht? –

+0

Was ist der Datentyp von Somevar? tatsächlich wird meine Funktion einen Cursor zurückgeben, also war ich verwirrt über den Datentyp der Variablen? –

Antwort

0

Hier Ihre Funktion aufgerufen werden, die eine varchar2 Variable nimmt und gibt einen refcursor (schwach typisierte).

CREATE OR replace FUNCTION fn_return_cur(v IN VARCHAR2) 
RETURN SYS_REFCURSOR 
IS 
    c1 SYS_REFCURSOR; 
BEGIN 
    OPEN c1 FOR 
     SELECT 'ABC' 
     FROM dual 
     WHERE 'col1' = v; 

    RETURN c1; 
END; 

/ 

Hier ist das Verfahren, die einen Cursor-Wert als Argument übergeben hat zu funktionieren, und der zurück Cursor als OUT Argument übergeben.

CREATE OR replace PROCEDURE Pr_pass_out_cur(v_2 OUT SYS_REFCURSOR) 
IS 
    func_arg VARCHAR2(3); 
    other_arg VARCHAR2(3); 
    CURSOR c_2 IS 
    SELECT 'ABC' col1, 
      'DEF' col2 
    FROM dual; 
BEGIN 
    LOOP 
     FETCH c_2 INTO func_arg, other_arg; 

     EXIT WHEN c_2%NOTFOUND; 

     v_2 := Fn_return_cur(func_arg); 
    END LOOP; 
EXCEPTION 
    WHEN OTHERS THEN 
      NULL; 
END; 

/ 

Lassen Sie mich Ihre Rückmeldung wissen.

+0

Vielen Dank Kaushik für Ihre Eingabe. Jetzt habe ich die Idee, wie man den Wert der Funktion in einem Cursor speichert. –

+0

Sie sind willkommen Kumpel! und danke. –

Verwandte Themen