定义一个ref cursor类型,就可以了

解决方案 »

  1.   

    为什么要放到临时表中呢?
    CREATE OR REPLACE PACKAGE "PKG_LINBO" as
      type myrctype is ref cursor;end pkg_linbo;CREATE OR REPLACE FUNCTION PROC_BADCHANGEUA(
    in_unit  IN NUMBER,
    in_bianhao  IN VARCHAR2,
    in_timef  IN DATE,
    in_timet  IN DATE,
    in_datatype IN VARCHAR2)
    RETURN PKG_LINBO.myrctypeAS
    rc PKG_LINBO.myrctype;BEGIN OPEN rc FOR
    SELECT rectime,badau * 100 AS badau
      FROM tsum_his_alarm
    WHERE rectime >= in_timef  
     and  rectime <= in_timet  
     and  unit = in_unit  
     and  bianhao = in_bianhao  
     and  alarm = 0;
        RETURN rc;

    END PROC_BADCHANGEUA;
      

  2.   

    提供以下一个例子参考吧,已测试CREATE OR REPLACE PACKAGE pkg_test
    AS
       TYPE myrctype IS REF CURSOR;   PROCEDURE get (p_id NUMBER, p_rc OUT myrctype);
    END pkg_test;
    /CREATE OR REPLACE PACKAGE BODY pkg_test
    AS
       PROCEDURE get (p_id NUMBER, p_rc OUT myrctype)
       IS
          sqlstr   VARCHAR2 (500);
       BEGIN
          IF p_id = 0 THEN
             OPEN p_rc FOR
                'SELECT ID, NAME, sex, address, postcode, birthday
                  FROM student';
          ELSE
             sqlstr :=
                'select id,name,sex,address,postcode,birthday
               from student where id=:w_id';
             OPEN p_rc FOR sqlstr USING p_id;
          END IF;
       END get;
    END pkg_test;
    /
      

  3.   

    能不能说具体一点?CREATE OR REPLACE PROCEDURE test 
    BEGIN
     
     //这个里面怎么写?
       
    END test;
    /
      

  4.   

    这样比较简洁了,具体问题那楼主你自已解决吧!CREATE OR REPLACE PACKAGE pkg_test
    AS
       TYPE myrctype IS REF CURSOR;
    END pkg_test;create or replace PROCEDURE get(p_id NUMBER, p_rc OUT pkg_test.myrctype)
       IS
          sqlstr   VARCHAR2 (500);
       BEGIN
    sqlstr :='select id,name,sex,address,postcode,birthday
               from student where id=:w_id';
             OPEN p_rc FOR sqlstr USING p_id;
    END get;
      

  5.   

    to glmcglmc(joe) :
    我要把数据放到临时表里,是为了要把这些数据作为Crystal Report报表的数据源。还能有什么其他的方法么?to  beckhambobo(beckham) :
    我参照写了一个,可是怎么调用它查看结果呢?
    CREATE OR REPLACE PACKAGE pkg_test
    AS
       TYPE myrctype IS REF CURSOR;   PROCEDURE get ( p_rc OUT myrctype);
    END pkg_test;
    /PROCEDURE get ( p_rc OUT myrctype)
       IS
         
       BEGIN
               
             OPEN p_rc FOR
                'SELECT *  FROM tbCityAreaPart';
               
       END get;
    END pkg_test;
    /我在SQL/PL下调用的代码如下:
     declare 
     cursor temp;
     begin
      exec pkg_test.get(temp);
    end;
    /可是还是报错了:
    ERROR 位于第 4 行:
    ORA-06550: 第 4 行, 第 8 列:
    PLS-00103: 出现符号 "PKG_TEST"在需要下列之一时:
    :=.(@%;
    符号 ":=" 被替换为 "PKG_TEST" 后继续。
      

  6.   

    你那样不行的,两个出错地方
    1、myrctype不是ORACLE内部对象,所以不直接引用,只能在包体名作前缀
    2、在包头声明的对象,只能在包体中定义,过程get已脱离了修改以下:
    CREATE OR REPLACE PACKAGE pkg_test
    AS
       TYPE myrctype IS REF CURSOR;END pkg_test;
    /create or replace PROCEDURE get ( p_rc OUT pkg_test.myrctype)
       IS
         
       BEGIN
               
             OPEN p_rc FOR
                'SELECT *  FROM tbCityAreaPart';
               
    END get;
    /
      

  7.   

    我已经把get的入口参数前加了前缀,改成象你那样了那我怎么调用我写的这个包呢?我想看看结果集
    可还是出错了
    我刚刚学习使用Oracle,谢谢帮忙看一下^_^SQL>  declare 
      2   cursor temp;
      3   begin
      4    exec pkg_test.get(temp);
      5  end;
      6  /
      exec pkg_test.get(temp);
           *
    ERROR 位于第 4 行:
    ORA-06550: 第 4 行, 第 8 列:
    PLS-00103: 出现符号 "PKG_TEST"在需要下列之一时:
    :=.(@%;
    符号 ":=" 被替换为 "PKG_TEST" 后继续。
    SQL>  declare 
      2   cursor temp;
      3   begin
      4   get(temp);
      5  end;
      6  /
     cursor temp;
     *
    ERROR 位于第 2 行:
    ORA-06550: 第 2 行, 第 2 列:
    PLS-00360: 无主体的游标说明需要返回类型
    ORA-06550: 第 2 行, 第 2 列:
    PL/SQL: Item ignored
    ORA-06550: 第 4 行, 第 6 列:
    PLS-00320: 此表达式的类型说明不完整或格式不正确
    ORA-06550: 第 4 行, 第 2 列:
    PL/SQL: Statement ignored
      

  8.   

    返回一个记录集,不能这样执行!而且过程的参数的OUT,没必要给它实际参数
      

  9.   

    呵呵,谢谢
    我的报表数据源已经可以通过简单的存储过程绑定出来了^_^
    虽然原理我还不是很明白为什么要把它写成包体呢?我可不可以直接定义一个返回游标型的out参数的存储过程?
    但是create or replace PROCEDURE get ( p_rc OUT REF CURSOR)这样写,编译不过去,有这种方法么?
      

  10.   

    请记住!CURSOR不是ORACLE内部存储对象,所以你直接引用它会出错,只能作PL/SQL内部体引用。或者你可以创一个记录对象也可以实现相同功能:create or replace type myobjectype as object (x int,y date,z varchar2(50));
      

  11.   

    呵呵,终于对Oracle有个模糊的认识了,还要继续好好学习^_^
    结贴给分了,呵呵