我想在oracle 的存储过程中直接返回结果集。如在sql server中的实现 Create Procedure sp_GetOrders
as
   Select * from Orders;
 应该怎么去实现。最好是给一个完整的存储过程的例子。
目的:是在.net中调用存储过程返回一个结果集,我们不允许在程序中嵌入sql代码
所有数据访问逻辑全部用存储过程实现。
调试成功及结贴。

解决方案 »

  1.   

    参考下别人的帖子,
     http://expert.csdn.net/Expert/topic/2058/2058571.xml?temp=.5344965
     http://expert.csdn.net/Expert/topic/1919/1919597.xml?temp=.7810785
      

  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 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;
      

  4.   

    表名:test_1
    列名:num(number),name(varchar2),sex(char),major(varchar2)建立过程:
    CREATE OR REPLACE PACKAGE pkg_test
    AS
       TYPE myrctype IS REF CURSOR;
    END pkg_test;
    /CREATE PROCEDURE PRO_SLE(INPUT1 in integer,INPUT2 in VARCHAR2,p_rc out pkg_test.myrctype)
    AS
    begin
    open p_rc for 'SELECT * FROM TEST WHERE AA='||INPUT1||' AND instr(BB,'||INPUT2||')>0';
    end;
    /
    执行过程:
    declare
    v_num TEST_1.num%type;
    v_name test_1.name%type;
    v_sex test_1.sex%type;
    v_major test_1.major%type;
    v_rc pkg_test.myrctype;
    begin
    PRO_SLE(1,'1',v_rc);
    loop
    fetch v_rc into v_num,v_name,v_sex,v_major;
    exit when v_rc%notfound;
    dbms_output.put_line(v_num||v_name||v_sex||v_major);
    end loop;
    end;