2017-07-23 2 views
0

Besoin d'aide. Scénario: Il existe une procédure à l'intérieur de laquelle nous avons un curseur. Je dois appeler une fonction qui prendra une entrée de cette valeur de curseur et retournera SYS_REFCURSOR.Comment stocker le résultat d'une fonction qui retournera sysrefcursor?

Je dois stocker ce résultat de la fonction dans une autre variable/curseur & besoin de retourner cette valeur de la procédure en tant que paramètre out.

J'utilise Oracle 11g.

Aidez s'il vous plaît! Comment vais-je procéder?

PFB Mon approche:

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; 
/

fonction à appeler

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

Qu'avez-vous fait jusqu'à maintenant? S'il vous plaît montrer votre code. – MKR

+1

Identique à tout autre type de données: 'somevar: = somefunction();' Qu'est-ce qui ne fonctionne pas? –

+0

quel sera le type de données de somevar? en fait ma fonction va retourner un curseur, donc j'ai été confus au sujet du type de données de varable? –

Répondre

0

Voici votre fonction qui prend une variable varchar2 et retourne A refcursor (faiblement typé).

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; 

/ 

est la procédure ici qui a une valeur de curseur passé comme argument à la fonction et le curseur retourné passé comme argument OUT.

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; 

/ 

Faites-moi savoir vos commentaires.

+0

Merci Kaushik pour votre contribution. maintenant j'ai eu l'idée comment stocker la valeur de la fonction dans un curseur. –

+0

Vous êtes les bienvenus mon pote! et merci. –