用包:
包头中声明:
TYPE REF_CURSOR IS REF CURSOR;FUNCTION TEST(v_cur REF_CURSOR) return integer;包体中实现:
FUNCTION TEST(v_cur REF_CURSOR) return integer
IS
....

解决方案 »

  1.   

    1、
    CREATE OR REPLACE  PACKAGE "SCOTT"."HWTYPE" as
      TYPE HWCURSOR IS REF CURSOR;
    end;
    2、
    CREATE OR REPLACE  PROCEDURE "SCOTT"."PROC_TEST_CURSOR" (DDD OUT 
        HWTYPE.HWCURSOR)
     as
    var_DEPTNO DEPT.DEPTNO%TYPE;
    var_DNAME  DEPT.DNAME%TYPE;
    var_LOC    DEPT.LOC%TYPE;
    begin
     
     --这样可以动态设置游标了。
     AA:='SELECT DEPTNO,DNAME,LOC FROM DEPT';
     open DDD for aa;
     
     
     --用起来和一般游标一样。
     FETCH DDD INTO var_DEPTNO,var_DNAME,var_LOC;  
     WHILE DDD%FOUND LOOP
     
      DBMS_OUTPUT.PUT_LINE(var_DEPTNO);   
      DBMS_OUTPUT.PUT_LINE(var_DNAME);
      DBMS_OUTPUT.PUT_LINE(var_LOC);
      FETCH DDD INTO var_DEPTNO,var_DNAME,var_LOC; 
     END LOOP;
     CLOSE DDD;
     
    EXCEPTION
    WHEN OTHERS THEN
      IF DDD%ISOPEN THEN
        CLOSE DDD;
      END IF; 
      
      
     
    end;
    3、sqlplus中进行测试:set serverout on
    var aa REFCURSOR
    exec scott.PROC_TEST_CURSOR(:aa);
    print :aa;这么用就行了!
      

  2.   

    谢谢两位的回复,能不能继续麻烦一下,就是我提出的第一点问题,我可能有很多的过程需要去调用这个包中的过程,这些过程的sql都不一定一样,操作的表都可能不一样,查询的列数自然也不会一样,你给的这个sample里边固定了是dept的3个列,请问能否从传进来的DDD中得到相关的列名和列数信息?如果不能都得到,能否得到列数信息?比如这个地方的三列,以及各列的type。
      

  3.   

    你可以把你要检索的字段作为变量传进去!!
    --这样可以动态设置游标了。
     AA:='SELECT DEPTNO,DNAME,LOC FROM DEPT';
     open DDD for aa;
    这句就是可以让你自己来拼你要的游标语句!另外你只要知道表名就可以知道表中的各个字段信息:
     select COLUMN_NAME,DATA_TYPE from cols where TABLE_NAME='你的大写表名';不知道是不是你想要的效果!
      

  4.   

    create or replace procedure aaaa
    ( select_sql in varchar2,    --传入要查询的字段名组
      from_sql   in varchar2,    --传入要查询的表名
      where_sql  in varchar2,    --传入要查询的条件
      DDD OUT HWTYPE.HWCURSOR)as
    sql_string  varchar2(5000);
    beginsql_string:= 'select ' || select_sql ||
                  ' from ' || from_sql || 
                 ' where ' || where_sql ;open DDD for sql_string;end;没测试过!你看行不?
      

  5.   

    这么说太累了!msn:[email protected]