设有如下过程:
CREATE OR REPLACE PROCEDURE P_TEST
(    
   v_cur           OUT  pk_sys_query.gv_sdquery_syscur,--多行记录返回  
   v_resultcode    OUT  NUMBER,
   v_resulterrinfo OUT  VARCHAR2

IS   
BEGIN 
   v_resultcode := -1;
   v_resulterrinfo := 'TradeOk';  
    
   OPEN v_cur FOR 
   SELECT f1,f2,f3 FROM t1 ;
          
   v_resultcode:=0 ; 
   
EXCEPTION
   WHEN OTHERS THEN
       v_resulterrinfo:='error end@ '||SQLERRM ; 
       v_resultcode:= -1;                 
END ;如何动态调用,并使用传出的游标?

解决方案 »

  1.   

    C:\>sqlplus /nologSQL*Plus: Release 9.2.0.1.0 - Production on 星期二 8月 22 12:14:24 2006Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.SQL> conn chanet/chanet@oradb
    已连接。SQL> var c_cur refcursor
    SQL> var v_err varchar2(1000);SQL> create or replace package pkg IS
      2    TYPE type_cur IS REF CURSOR;
      3
      4    PROCEDURE prc_getRecord(pRecord OUT type_cur, pErrText OUT VARCHAR2);
      5  end pkg;
      6  /程序包已创建。SQL> create or replace package body pkg IS
      2    PROCEDURE prc_getRecord(pRecord OUT type_cur, pErrText OUT VARCHAR2) IS
      3    BEGIN
      4      OPEN pRecord FOR 'SELECT * FROM tab';
      5    EXCEPTION
      6      WHEN OTHERS THEN
      7        pErrText:= SQLERRM;
      8    END prc_getRecord;
      9  end pkg;
     10  /程序包主体已创建。SQL> exec pkg.prc_getRecord(:c_cur, :v_err);PL/SQL 过程已成功完成。SQL> print c_cur;TNAME                          TABTYPE  CLUSTERID
    ------------------------------ ------- ----------
    EMP                            TABLE
    PLAN_TABLE                     TABLE
    SFZ                            TABLE
      

  2.   

    to - chanet(牧师) : 
        你理解错了,我的意思是在另外一个过程中动态调用存储过程 P_TEST,并使用p_test输出的游标。
      

  3.   

    --创建package
    create or replace package pak
    as
       type refCursor is ref cursor;
    end;--创建被动态调用存储过程
    create or replace procedure P_TEST
    (
       cur out pak.refCursor
    )
    as
    begin
         open cur for select * from A;
    end;
    --创建调用存储过程
    create or replace procedure p
    as
    cur pak.refCursor;
    v_row A%rowtype;
    begin
          execute immediate 'begin P_TEST(:cur); end;' using out cur;
          loop
              fetch cur into v_row;
              exit when cur%notfound;
              dbms_output.put_line(to_char(v_row.id));
          end loop;
          close cur;
    exception
          when others then
          if cur%isopen then
             close cur;
          end if;
          dbms_output.put_line(SQLERRM);
    end;--测试
    begin
    p;
    end;
      

  4.   

    to vivianfdlpw: 
      不行,总是出错
      

  5.   

    sandygood(伤心太平洋) :
        我是动态调用存储过程,包括参数,也是在调用的时候才知道的。至于作用,还是蛮大的。
    谁能帮我搞搞?
      

  6.   

    lz你可以参考一下
    不过我一执行就报连部上oracle
    CREATE OR REPLACE PROCEDURE ll_03 IS
    tmpVar NUMBER;
    sqlpro varchar2(100);
    p_cursor sys_refcursor;
    v_area varchar2(20);
    BEGIN
       
       dbms_output.put_line('ll03');
       tmpvar:=1;
       if tmpvar=1 then 
           sqlpro:='begin ll_01; end;';
       end if;
      
       EXECUTE IMMEDIATE sqlpro;
       tmpvar:=2;
       if tmpvar=2 then 
           sqlpro:='begin ll_02(:1) ; end;';
       end if;
       dbms_output.put_line(sqlpro);
       eXECUTE IMMEDIATE sqlpro using out p_cursor;
       /*
       loop
       fetch p_cursor into v_area;
      exit when p_cursor%notfound;
      dbms_output.put_line (v_area) ;
       end loop;
      */
    END ll_03;
      

  7.   

    建议首先参考这个
    select * from  USER_ARGUMENTS 
    或许对你有所帮助
      

  8.   

    lz可以参考一下动态执行pl/sql可以解决这个问题
    不过有的版本会报ora-03113 的错误
      

  9.   

    to : icedut(冰) 
        我也就是和你报一样的错误,因此想上来问问各位大虾们有没有什么好的方法。
    其实动态调用存储过的目的是为了开发即席报表,我的设想是:用户先选择查询的报表,以及查询条件,然后提交,等过一段时间,譬如一天/一个月,再登录系统进行查询,这样的目的是为了能够让用户自定义报表,还有对大数据量查询的一个后台准备。
        但现在怎么试都没发弄出来,郁闷哪。    对了说一下,我是在oracle下调用的。
      

  10.   

    建议把记录放到临时表里面,
    这样动态执行存储过程返回的游标记录集,在Oracle里面的确麻烦死了SqlServer里面倒是可以用
    insert into #F
    exec '存储过程名 参数1,参数2'
      

  11.   

    谢谢大家的支持,这个问题我从相关书上看到了,oracle不支持动态调用游标。所以这个问题无解。但还是多谢大家了