定义了一个存储过程
  procedure GetDate(
    aParam  in varchar2,
    aExesql in out varchar2,
    aReturnSet out sys_refcursor      
  ) is
  begin
    select sysdate into aExesql from dual;
    open aReturnSet for 'select sysdate today from dual';
  end;
测试的时候
set serveroutput on;
declare
  tcursor sys_refcursor;
  vSql varchar2(32700);
  begin 
    vSql := 'aa';
    execute immediate 'call GetDate(''aaa'', :V1, :V2)' using in out vSql, out tcursor;
    dbms_output.put_line(vSql);                
  end;
/
返回错误,未连接Oracle

解决方案 »

  1.   

    toad测试DECLARE
      tcursor sys_refcursor;
      vSql VARCHAR2(32700);
      BEGIN 
        vSql := 'aa';
    GetDate('aaa', vSql, tcursor);
        EXECUTE IMMEDIATE 'begin GetDate(''aaa'', :1,:2); END;' USING IN OUT vsql,OUT tcursor ;
        DBMS_OUTPUT.PUT_LINE(vSql);                
      END;
      

  2.   

    返回错误,未连接Oracle
    --也许当时你的连接有问题
    execute immediate 'call GetDate(''aaa'', :V1, :V2)' using in out vSql, out tcursor;
    动态执行存储过程的语法错误,要加begin end
      

  3.   

    加了begin和end试过来,报同样的错误.
      

  4.   

    我试过如果那个参数没用游标类型的话,是可以的,用call也是可以的.
      

  5.   

    sqlplus 测试
    set serveroutput on;
    DECLARE
      tcursor sys_refcursor;
      vSql VARCHAR2(32700);
      BEGIN 
        vSql := 'aa';
    GetDate('aaa', vSql, tcursor);
        EXECUTE IMMEDIATE 'begin GetDate(''aaa'', :1,:2); END;' USING IN OUT vsql,OUT tcursor ;
        DBMS_OUTPUT.PUT_LINE(vSql);                
      END;
    /
    --结果
    08-1月 -07
    -----------------------------------------
    都没有问题阿
    也许楼主连接的地方错了
    重新连接以下
      

  6.   

    GetDate('aaa', vSql, tcursor);
        EXECUTE IMMEDIATE 'begin GetDate(''aaa'', :1,:2); END;' USING IN OUT vsql,OUT tcursor ;不好意思,我想问一下,为什么要在执行EXECUTE IMMEDIATE 之前加这个GetDate('aaa', vSql, tcursor);
      

  7.   

    我加上GetDate('aaa', vSql, tcursor);就可以通过,不加就还是报oracle连接失败!!!用的是pl/sql developer
      

  8.   


    不好意思,我想问一下,为什么要在执行EXECUTE IMMEDIATE 之前加这个GetDate('aaa', vSql, tcursor);vSql := 'aa';
    GetDate('aaa', vSql, tcursor);
    DBMS_OUTPUT.PUT_LINE(vSql);  
        EXECUTE IMMEDIATE 'begin GetDate(''aaa'', :1,:2); END;' USING IN OUT vsql,OUT tcursor ;
        DBMS_OUTPUT.PUT_LINE(vSql);                我本意是想两种方法测试,结果拉了一个DBMS_OUTPUT.PUT_LINE(vSql);
    一个是普通调用,一个是动态调用
      

  9.   


    我加上GetDate('aaa', vSql, tcursor);就可以通过,不加就还是报oracle连接失败!!!用的是pl/sql developer=======
    pl/sql developer我没用过
    我给你了sqlplus的测试方法
    你可以测试一下
    如果测试通过
    那就不是你的存储过程的问题
    和你的工具有关系了
      

  10.   

    一样不行!!用了oracle自带的pl/sql测试过了,是不是数据库的问题,我普通调用是没有问题的。
    已连接。
    SQL> declare
      2    tcursor sys_refcursor;
      3    vSql varchar2(200);
      4    begin 
      5      vSql := 'aa';
      6      execute immediate 'begin GetDateTest(''aaa'', :1, :2); end;' using in out vSql, out tcursor
    ;
      7      dbms_output.put_line(vSql);                
      8    end;
      9  /
    declare
    *
    ERROR 位于第 1 行:
    ORA-03113: 通信通道的文件结束
      

  11.   

    ERROR 位于第 1 行:
    ORA-03113: 通信通道的文件结束
    --
    你找找这个问题怎么解决吧
      

  12.   

    发现了一种比较奇怪的方式
    只要在动态调用存过之前使用一下那个游标变量就不会报错了
    比如set   serveroutput   on; 
    declare 
        tcursor   sys_refcursor; 
        vSql   varchar2(32700); 
        begin   
            vSql   :=   'aa '; 
            open tcursor for 'select 1 from dual';
            close tcursor;
            execute   immediate   'call   GetDate( ' 'aaa ' ',   :V1,   :V2) '   using   in   out   vSql,   out   tcursor; 
            dbms_output.put_line(vSql);                                 
        end;