现在有一批SP的参数和返回值形式都是一样的,下面的形式  FUNCTION XXXXXXX(
          pin_strKind     IN VARCHAR2,
          pin_strType       IN VARCHAR2,
          pin_intReqNum    IN NUMBER,
          pout_intResNum   OUT NUMBER,
          pout_strNewNum   OUT STR_NEW_NUM_ARRAY,
          pin_strUserId    IN VARCHAR2,
          pin_strProgramId IN VARCHAR2
                   )
  RETURN BOOLEAN
我在另外一个SP main 里面需要调用到这批SP中的某一个SP,
具体的调用那一个SP,是通过将SP的名字从参数里面传进来的PROCEDURE main(pin_strSPName     IN VARCHAR2)在调用 XXXXXXX 以后,我需要取得返回的pout_intResNum   ,pout_strNewNum   还有XXXXXXX 的返回值
因为调用的SP名不定,所以猜测应该用 EXECUTE IMMEDIATE 来做
vCallSP VARCHAR2(2000);
vResNum NUMBER;
vNewNum STR_NEW_NUM_ARRAY;
vReturn BOOLEAN;
vCallSP := pin_strSPName || '(''1'',''090'',1,:vResNum,:vNewNum,''' || pin_UserID || ''',''programID'')';
EXECUTE IMMEDIATE vCallSP USING OUT vResNum,OUT vNewNum into vReturn;但是上面这个写法在导入这个SP的时候就通不过,有哪位高人能指点一下错在哪里。
如果这样做实现不了的话,应该用什么方式来实现?谢谢

解决方案 »

  1.   

    sp是什么东东?
    是不是“source package”简称?建议楼主在这添一个“call ”试试:
    vCallSP := 'call '||pin_strSPName || '(''1'',''090'',1,:vResNum,:vNewNum,''' || pin_UserID || ''',''programID'')';
      

  2.   

    楼上的SP->PROCEDURE 只是一种叫法我试过你这个方法了,现在关键是在 下面这一句在导入整个PROCEDURE的时候报编译错误。
    EXECUTE IMMEDIATE vCallSP USING OUT vResNum,OUT vNewNum into vReturn;我想知道上面这一句的写法有什么问题。
      

  3.   

    改为
    EXECUTE IMMEDIATE vCallSP USING vResNum,vNewNum into vReturn;
    再试试
      

  4.   

    加上begin ...end;试试
    我在817里面用call的方法不成功,不知道是不是这个问题,但是begin .. end 肯定没有问题。vCallSP := 'begin 'pin_strSPName || '(''1'',''090'',1,:vResNum,:vNewNum,''' || pin_UserID || ''',''programID''); end;';
    EXECUTE IMMEDIATE vCallSP USING OUT vResNum,OUT vNewNum into vReturn;
      

  5.   

    这时我以前整理的一点东西,拿出来供你参考:测试:
    oracle 817,win 2000 server第一种:带返回参数的存储过程
    create or replace procedure p_demo(v_col1 in varchar2,v_col2 out varchar2)
    as
    begin
    v_col2:=v_col1||' out!';
    end p_demo;
    /declare
    v_1 varchar2(20):='aaa';
    v_2 varchar2(30);
    begin
    execute immediate 'call p_demo(:1,:2);' using v_1,out v_2;
    dbms_output.put_line(v_2);
    end;
    /
    aaa out!PL/SQL 过程已成功完成。第二种:使用函数
    SQL> create or replace function f_demo(v_col1 varchar2) return varchar2
      2  as
      3  begin
      4  return v_col1||' out!';
      5  end f_demo;
      6  /函数已创建。SQL> declare
      2  v_1 varchar2(20):='aaa';
      3  v_2 varchar2(30);
      4  begin
      5  execute immediate 'begin :1:=f_demo(:2); end;' using out v_2,v_1;
      6  dbms_output.put_line(v_2);
      7  end;
      8  /
    aaa out!PL/SQL 过程已成功完成。SQL> 
      

  6.   

    to seayar(习习) ( ) 信誉:100 
    call 放在单独的存储过程中可以实现,如果放在包中,用call会出现错误,你遇到过否?