create or repalce  function  selMineMonth(
           p_date date date   --到月 如:2003-02
           )
    return varchar2
is
   v_temp1 varchar2(100);
   v_temp2 varchar2(100);
   cursor  v_cursor is select distinct to_char(proddate,'yyyy-mm') from plantdayrep where to_char(proddate,'yyyy-mm')<=p_date;begin --没有begin怎么行?  open v_cousor;
 loop
  fetch v_cursor into v_temp1;
    exit when v_cursor%NOTFOUND
    cursor t_cursor is   select to_char(proddate,'yyyy-mm-dd') from   plantdayrep where to_char(proddate,'yyyy-mm')=v_temp1;
   --这个地方能行吗?这样做可以吗?这个地方如果不定义游标又怎么办呢?
   --这个地方不行,游标必须先定义,我建议使用动态游标。
   open cursor t_cursor;
 loop
   fetch t_cursor into v_temp2;
   exit when t_cursor%NOTFOUND
  --I want to deal data here end loop;
close t_cursor;end loop;
close v_cursor;end;

解决方案 »

  1.   

    粗略修改如下:
    create or repalce  function  selMineMonth(
               p_date date date   --到月 如:2003-02  --建议使用string类型
               )
        return varchar2
    is
       v_temp1 varchar2(100);
       v_temp2 varchar2(100);
       type cur_type is ref cursor; 
       myCur cur_type;
       cursor  v_cursor is select distinct to_char(proddate,'yyyy-mm') from plantdayrep where to_char(proddate,'yyyy-mm')<=p_date;
    begin
      open v_cousor;
      loop
      fetch v_cursor into v_temp1;
        exit when v_cursor%NOTFOUND
        open myCur for select to_char(proddate,'yyyy-mm-dd') from   plantdayrep where to_char(proddate,'yyyy-mm')='||v_temp1;
       --这个地方能行吗?这样做可以吗?这个地方如果不定义游标又怎么办呢?
       
        loop
           fetch myCur into v_temp2;
           exit when myCur%NOTFOUND
           --do something;
        end loop;
        close myCur;  end loop;
      close v_cursor;end selMineMonth;
      

  2.   

    create or repalce  function  selMineMonth(
               p_date date date   --到月 如:2003-02
               )
        return varchar2
    is
       v_temp1 varchar2(100);
       v_temp2 varchar2(100);
       cursor  v_cursor is select distinct to_char(proddate,'yyyy-mm') from  plantdayrep where to_char(proddate,'yyyy-mm')<=p_date;
        cursor t_cursor(in_yymm in varchar2) is   select to_char(proddate,'yyyy-mm-dd') from   plantdayrep where to_char(proddate,'yyyy-mm')=in_yymm;begin
      open v_cousor;
      loop
        fetch v_cursor into v_temp1;
        exit when v_cursor%NOTFOUND
       
        open t_cursor(v_temp1);
        loop
          fetch t_cursor into v_temp2;
          exit when t_cursor%NOTFOUND
          --I want to deal data here    end loop;
        close t_cursor;
      end loop;
      close v_cursor;
    end;   
      

  3.   

    上面的问题解决了,怎么知道到了游表最后一条纪录呢?t_cursor%rowcount 怎么用呢?我要在游标最后一条纪录上作相应处理,该怎么写?
      

  4.   

    将exit when t_cursor%NOTFOUND;
    改为
     if t_cursor%NOTFOUND then
       -- 这时表明已经到了游标最后,v_temp2仍保留着最后一条记录的值。
       ....
       exit;
     end if;
      

  5.   

    if t_cursor%NOTFOUND and t_cursor%ROWCOUNT >0 then
    这样就不会处理没有结果的情况。