参考
declare 
       --类型定义
       cursor c_job
       is
       select empno,ename,job,sal
       from emp
       where job='MANAGER';
       --定义一个游标变量
       c_row c_job%rowtype;
begin
       open c_job;
         loop
           --提取一行数据到c_row
           fetch c_job into c_row;
           --判读是否提取到值,没取到值就退出
           --取到值c_job%notfound 是false 
           --取不到值c_job%notfound 是true
           exit when c_job%notfound;
            dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);
         end loop;
       --关闭游标
      close c_job;
end;

解决方案 »

  1.   

    怎么个返回法?如果返回值不是很多,你可以把这些结果拼接成一个长串,返回完以后,再拆开。如果返回值过多,建议返回一个游标,再对游标进行 loop 。
      

  2.   

    CREATE OR REPLACE FUNCTION TEST_FN_INPUNCH1 --上班时间1
    (P_NUM VARCHAR2,
    P_DATE DATE)
    RETURN DATE IS
    INPUNCH1 DATE;
    TYPE A IS REF CURSOR;
    P_CURSOR A;
    BEGIN
    OPEN P_CURSOR FOR SELECT STARTDTM INTO INPUNCH1 FROM VP_TIMESHEETITMV42 
    WHERE PERSONNUM=P_NUM 
    AND EVENTDATE=P_DATE;
    LOOP
      FETCH P_CURSOR INTO INPUNCH1;
      EXIT WHEN P_CURSOR%NOTFOUND;
      END LOOP;
      CLOSE P_CURSOR;
      RETURN INPUNCH1;
     END ;   这样可以运行但是取一个值,是不是语句错误呢
      

  3.   

    你是要显示还是要返回啊?如果返回的话可以直接把游标返回来
    给你个范例,下面这个是通过过程out参数将游标返回的
    create or replace procedure my_procedure
    (mypageNo number,mypageSize number,myInfo_Cursor out sys_refcursor)
    as
    pageNO number;
    pageSize number;begin 
    open myInfo_Cursor for 
    select * from product 
    where pid between 1 + (pageNo - 1) * pageSize and 4 + (pageNo - 1) * pageSize;

    end;
      

  4.   

    你是不是想一个函数,要返回两列或多列?比如,你执行 select myfn(p) from dual ,结果能看到两列?
      

  5.   

    这样写结果,是不是还要设置一个参数呢?
    我想要的是要显示多个结果的那种,运行了之后总是显示一个,如果返回refcursor的话 则结果显示为一个<CURSOR>
      

  6.   

    CREATE OR REPLACE FUNCTION OFILM_FN_INPUNCH1 --上班时间1
    (P_NUM VARCHAR2,
    P_DATE DATE
    )
    RETURN DATE IS
    P_CURSOR SYS_REFCURSOR;
    INPUNCH1 DATE;
    BEGIN
    OPEN P_CURSOR FOR SELECT STARTDTM  FROM VP_TIMESHEETITMV42 
    WHERE PERSONNUM=P_NUM 
    AND EVENTDATE=P_DATE;
    LOOP
      FETCH P_CURSOR INTO INPUNCH1;
      EXIT WHEN P_CURSOR%NOTFOUND;
    RETURN INPUNCH1;
    END LOOP;
    CLOSE P_CURSOR;
     END ;
    还是只显示一行!急求!!
      

  7.   

    最普通的做法,额外传一个特定参数,根据参数值返回不同值
    FUNCTION OFILM_FN_INPUNCH1 (P_NUM VARCHAR2,P_DATE DATE,flag number)
    在function内部根据flag返回不同的值即可,
      

  8.   

    --1.定义过程,返回游标
    create or replace procedure procedure_name --过程名
    (
        v_sdate          in varchar2,
        v_edate          in varchar2,    v_cur            OUT pack_name.record_cur,--此处定义一个record记录的集合(定义在一个包里,里面具体定义需要返回多少列)    v_retyrn_result  OUT VARCHAR2
    )begin
           OPEN v_cur FOR select * from table_name;              
        
    end;
    --2.以上返回的游标结果集合的定义
    CREATE OR REPLACE PACKAGE pack_name AS  TYPE record_name IS RECORD(
        F1  VARCHAR2(200),
        F2  VARCHAR2(200),
        F3  VARCHAR2(200));
       --需要多少列,什么类型,自己定义
      TYPE record_cur IS REF CURSOR RETURN record_name;END;--3.前台java调用即可。