我有存储过程A。B,现在要在A里调用B。B有返回值,请问:我如何从A中得到B的返回值?
我是这样的调用的。
 v_sql :='call '||s_proname||' ('||v_sqltemp||')';
 execute   immediate  v_sql;s_proname是存储过程名。入参v_sqltemp是动态拼起来的。我现在要得到s_proname存储过程中的返回值。

解决方案 »

  1.   

    返回值是什么类型,在前面定义一个相应类型的变量,然后
      execute       immediate     v_sql into 这个变量;
    如果是几个,那相应的定义几个。 
      

  2.   

    好像需要单引号,如果v_sqltemp是个字符串的话,不是很确定。
    v_sql   := 'call   '||s_proname|| '   ('''||v_sqltemp||''') '; 代码贴全点?
      

  3.   

    存储过程的返回值,你是不是指的 out 参数??例如 p_exatest(id in number, sname out varchar2);
    declare
        v_param1       number;
        v_param2       varchar2(20);
        v_sql          varchar2(100);
    begin
        v_param1 := 1;    v_sql := 'call p_exatest(:param1,:param2)';
        execute immediate v_sql using v_param1, v_param2;
        dbms_output.put_line(v_param2);
    end;
    /
      

  4.   

    create or replace procedure mof_projob1 is
       s_proname       varchar2(200);--存储过程名称
       v_sql           varchar2(50); --调用存储过程sql
       v_sqltemp       varchar2(200);--拼参数的sql
       retcode         varchar2(20);--获得执行存储过程的返回值
       s_prodesc       varchar2(160);--存储过程描述
       s_start_date    date;--程序开始时间
       s_end_date      date;--程序结束时间
       
          
       
      cursor myCursor(s_proname varchar2) is
      select 
       pp.parvalue
       from mof_pro_name pn,
       mof_pro_parameter pp
      where pn.id = pp.proid 
      and pn.proname=s_proname
      order by pp.parnum asc;
      
    begin  retcode:='';
      
      s_start_date:=sysdate;
      DBMS_OUTPUT.PUT_LINE(s_start_date);
      
     select pn.proname,
            pn.prodesc
       into s_proname,s_prodesc
       from mof_pro_name pn
       where pn.id = 1;
       
      for results in myCursor(s_proname)
      
        loop
         v_sqltemp:=v_sqltemp||','''||results.parvalue||'''';
         
        end loop;
        
        v_sqltemp:=substr(v_sqltemp,2,length(v_sqltemp))||',''''';
        
        
      --call test 
      v_sql :='call '||s_proname||' ('||v_sqltemp||')';  
      
       DBMS_OUTPUT.PUT_LINE(v_sql);
       
      execute   immediate  v_sql into retcode;  
      
      DBMS_OUTPUT.PUT_LINE(retcode);
      
      s_end_date:=sysdate;
      
      DBMS_OUTPUT.PUT_LINE(s_end_date);
      --向日志表中插入数据
      
      
    end mof_projob1;
    我贴出我的程序,请大家看看了。
      

  5.   

    怀疑 v_sqltemp 最后没有拼对。。
      

  6.   

    v_sqltemp 是  'aaaa','bbbb','' 
      

  7.   

    试试5楼的办法吧,似乎你的s_proname是function啊,如果是存储过程,那个call语句可是把所有的参数都设定了噢。
      

  8.   

    可以有其他的方式调别的存储过程吗?只要能实现就行。我就是拿不到被调存储过程的out值
      

  9.   

    你的调用格式不对,要是函数返回的,可以直接调用,要是过程的out,你在调用的时候要声明,然后传入,
    你可以打印下v_sql   := 'call   '||s_proname|| '   ( '||v_sqltemp|| ') '; 
    你这个sqltemp是没有''分割的create or replace procedure testa1
    (sqlstmt in varchar2,refcursor out sys_refcursor)
    as
    begin
      open refcursor
      for sqlstmt;
    end;
    /declare
    sqlstmt varchar2(100):='select 1 id  from dual';
    refcursor sys_refcursor;
    vid number(1);
    begin
     --testa1(sqlstmt,refcursor);
     execute immediate 'call testa1(:1,:2)' using sqlstmt,refcursor;
     loop
     fetch refcursor into vid;
     exit when refcursor%notfound;
      dbms_output.put_line(vid);
     end loop;
    end;
    /
      

  10.   


    楼上把你的游标类型改成 out参数是varchar2类型的试试看?我这里死也出不来,说说IN 绑定变量绑定到 OUT 位置,但是用游标就没问题
      

  11.   

    搞明白了,如果是输出参数,要显式指名,shit
      

  12.   

    楼主我把我的测试的贴出来,希望对你有点帮助哈。
    drop table emp;
    create table emp(A varchar2(10),B varchar2(10),C varchar2(10));
    insert into emp values('1','1','1');
    insert into emp values('2','2','2');
    insert into emp values('3','3','3');commit;create or replace procedure p_test_dym(
    i_A in varchar2,
    o_B out varchar2
    )
    as 
    begin
    select B into o_B from emp where emp.A = i_A;
    end;
    /create or replace procedure p_call_dym(
    v_proc in varchar2,
    v_param in varchar2
    )
    as
    v_2 emp.B%TYPE;
    begin
    execute immediate 'call '||v_proc||'(:1,:2)' using in v_param,out v_2;
    dbms_output.put_line(v_2);
    end;
    /exec p_call_dym('p_test_dym','2');