怎样用存储过程返回记录集
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; 
/

解决方案 »

  1.   

    去cnoug.com看看,我这个复制的由乱吗!
      

  2.   

    谢谢,不过CNOUG我好像进不去
      

  3.   

    我写的一个过程返回记录集的例子,你可以参考着改一下:--包头
    create or replace package pkg_test
    as
      type myCursor is ref cursor;
      function get(p_id number) return myCursor;
    end pkg_test;
    --包体
    create or replace package body pkg_test 
    as
    --******************************************************************
      --输入ID 返回记录集的函数
      function get(p_id number) return myCursor is
         rc myCursor;
         strsql varchar2(200);
      begin
         if p_id=0 then 
            open rc for select a.user_name from fnd_user a ;  
         else
            strsql:='select a.user_name from fnd_user a where a.user_id=:p_id';
            open rc for strsql using p_id;
         end if;
         return rc;  
         end get;
         
    end pkg_test;--调用
    set serverout on 
    declare 
      w_rc pkg_test.myCursor;
      w_name varchar2(100);
    begin
      w_rc:=pkg_test.get(0);
      loop
      fetch w_rc into w_name;
            exit when w_rc%notfound;
      dbms_output.put_line(w_name);
      end loop;
    end;
    /
    --在JAVA中调用过程,你可以到这里参考一下:http://www.cnjsp.org/view.jsp?column=2&id=576
      

  4.   

    关注中,在.net中有该怎么调用呢?
      

  5.   

    输入输出的标准游标写法//返回游标//建包CREATE OR REPLACE PACKAGE pkg_testASTYPE myrctype IS REF CURSOR;PROCEDURE get (p_id NUMBER, p_rc OUT myrctype);END pkg_test;///建过程CREATE OR REPLACE PACKAGE BODY pkg_testASPROCEDURE get (p_id NUMBER, p_rc OUT myrctype)ISsqlstrVARCHAR2 (500);BEGINIF p_id = 0 THENOPEN p_rc FORSELECT ID, NAME, sex, address, postcode, birthdayFROM student;ELSEsqlstr :='select id,name,sex,address,postcode,birthdayfrom student where id=:w_id';OPEN p_rc FOR sqlstr USING p_id;END IF;END get;END pkg_test;///测试declarev_ID varchar2(10);v_NAME varchar2(30);v_sex varchar2(2);v_address varchar(50);v_postcode varchar(6);v_birthday date;v_rc pkg_test.myrctype;beginpkg_test.get(0,v_rc);loopfetch v_rc into v_id,v_name,v_sex,v_address,v_postcode,v_birthday;exit when v_rc%notfound;dbms_output.put_line(v_id||v_name||v_sex||v_address||v_postcode||v_birthday);end loop;end;/例二://返回游标//建包CREATE OR REPLACE PACKAGE testASTYPE myrctype IS REF CURSOR;END test;///建过程create procedure pro(c out test.myrctype)asstr varchar2(200);beginstr:='select * from student';open c for str;end;///测试declarev_ID varchar2(10);v_NAME varchar2(30);v_sex varchar2(2);v_address varchar(50);v_postcode varchar(6);v_birthday date;v_rc test.myrctype;beginpro(v_rc);loopfetch v_rc into v_id,v_name,v_sex,v_address,v_postcode,v_birthday;exit when v_rc%notfound;dbms_output.put_line(v_id||v_name||v_sex||v_address||v_postcode||v_birthday);end loop;end;/
      

  6.   

    看了各位的答案,我已经测试通过了。非常感谢。
    不过为什么都是要自己先定义一个CURSOR呢,“TYPE myrctype IS REF CURSOR;”我发现直接用CURSOR好像通不过,如下
    Function get return cursor 
    is cr cursor;
    begin 
    open cr for 'select code from a';
    return cr;
    end get;
      

  7.   

    看了各位的答案,我已经测试通过了。非常感谢。
    不过为什么都是要自己先定义一个CURSOR呢,“TYPE myrctype IS REF CURSOR;”我发现直接用CURSOR好像通不过,如下
    Function get return cursor 
    is cr cursor;
    begin 
    open cr for 'select code from a';
    return cr;
    end get;