小弟初学oracle,遇到一个难题,有张表 
NAME                            RESULT 
------------------------------- ---------- 
kevin                          101 
tom                            101 
...... 我想取出RESULT=101的人的名字,经别人提示,写了一个函数如下: CREATE OR REPLACE  FUNCTION "SYSTEM"."get_values" ( 
  p_str in int 
) return SYS_REFCURSOR 
as 
r SYS_REFCURSOR; 
BEGIN 
  OPEN r FOR select name from stu_result where RESULT=p_str; 
  RETURN r; 
END; 写完之后不知道该如何使用了,select get_values('101') from dual 这样不行。不知道怎么才能得到这个函数返回的值? 
另外,我想在C#中调用这个函数取它的返回值,又该如何做呢?请说详细点,最好有个demo ,谢谢大家了!!!!

解决方案 »

  1.   


    给你个例子:
    CREATE OR REPLACE FUNCTION gg(s INT,e INT) RETURN SYS_REFCURSOR AS 
     r_c SYS_REFCURSOR;
    BEGIN
    OPEN r_c FOR
     SELECT ename,empno
       FROM (SELECT ename,empno, ROW_NUMBER() OVER(ORDER BY ENAME) RN FROM SCOTT.EMP T)
      WHERE RN >= S
        AND RN <= E;
    RETURN r_c;
    END;
    /DECLARE
     r_c SYS_REFCURSOR;
     v_c1 VARCHAR2(10);
     v_c2 VARCHAR2(10);
    BEGIN
     r_c:=gg(2,6);
     LOOP
      FETCH r_c INTO v_c1,v_c2;
      EXIT WHEN r_c%NOTFOUND;
      dbms_output.put_Line(v_c1||'-'||v_c2);
     END LOOP;
     CLOSE r_c;
    END;
    /输出:
    ALLEN-7499
    BLAKE-7698
    CLARK-7782
    FORD-7902
    JAMES-7900
      

  2.   

    试了下,我的可以
    SQL> CREATE OR REPLACE  FUNCTION get_values( p_str in int )
      2  return SYS_REFCURSOR
      3  as
      4  r SYS_REFCURSOR;
      5  BEGIN
      6  OPEN r FOR select ename from emp where deptno=p_str;
      7  RETURN r;
      8  END;
      9  /函数已创建。
    SQL> select get_values(10) from dual;GET_VALUES(10)
    --------------------
    CURSOR STATEMENT : 1CURSOR STATEMENT : 1ENAME
    ----------
    CLARK
    KING
    MILLER
    SQL>
      

  3.   


    建议用存储过程返回,在C#中指定CommandType 为 storedprocedure
      

  4.   


    写成存储过程的话,同样返回这个游标就可以了吧???然后在c#中用sqlreader取就行了,是这样吗?我还没试