刚好碰到同样的问题,找了个小东西。共享:1、建立测试表
CREATE TABLE student
(
 id                         NUMBER,
 name                       VARCHAR2(30),
 sex                        VARCHAR2(10),
 address                    VARCHAR2(100),
 postcode                   VARCHAR2(10),
 birthday                   DATE,
 photo                      LONG RAW
)
/2、建立带ref cursor定义的包和包体及函数:
CREATE OR REPLACE
package pkg_test as
/* 定义ref cursor类型
  不加return类型,为弱类型,允许动态sql查询,
  否则为强类型,无法使用动态sql查询;
*/
 type myrctype is ref cursor; --函数申明
 function get(intID number) return myrctype;
end pkg_test;
/CREATE OR REPLACE
package body pkg_test as
--函数体
  function get(intID number) return myrctype is
    rc myrctype;  --定义ref cursor变量
    sqlstr varchar2(500);
  begin
    if intID=0 then
       --静态测试,直接用select语句直接返回结果
       open rc for select id,name,sex,address,postcode,birthday from student;    else
       --动态sql赋值,用:w_id来申明该变量从外部获得
       sqlstr := 'select id,name,sex,address,postcode,birthday from student wh
ere id=:w_id';
       --动态测试,用sqlstr字符串返回结果,用using关键词传递参数
       open rc for sqlstr using intid;
    end if;    return rc;
  end get;end pkg_test;
/3、用pl/sql块进行测试:
declare
 w_rc       pkg_test.myrctype; --定义ref cursor型变量 --定义临时变量,用于显示结果
 w_id       student.id%type;
 w_name     student.name%type;
 w_sex      student.sex%type;
 w_address  student.address%type;
 w_postcode student.postcode%type;
 w_birthday student.birthday%type;begin
 --调用函数,获得记录集
 w_rc := pkg_test.get(1); --fetch结果并显示
 fetch w_rc into w_id,w_name,w_sex,w_address,w_postcode,w_birthday;
 dbms_output.put_line(w_name);
end;

解决方案 »

  1.   

    外部程序(比如Java之类的)怎么得到结果集?
      

  2.   

    我的解决方法是:
    1、定义一个函数FUNCTION ,其返回一个游标类型
    2、在函数OPEN yourCursor FOR ...(select 语句)
      

  3.   

    CREATE OR REPLACE FUNCTION PROC_DAYCHANGEFREQ(
    in_unit  IN NUMBER,
    in_bianhao  IN VARCHAR2,
    in_timef  IN DATE,
    in_timet  IN DATE)
    RETURN PKG_LINBO.myrctypeAS
    rc PKG_LINBO.myrctype;BEGIN
      OPEN rc FOR
    SELECT rectime,freq
     FROM  this_alarm  
    WHERE rectime >= in_timef  
     and  rectime <= in_timet  
     and  unit = in_unit  
     and  bianhao = in_bianhao  
     and  alarm = 0;    RETURN rc;
     
    END PROC_DAYCHANGEFREQ;