请问,如何能得到当前纪录是不是游标的最后一条?(用%NOTFOUND是已经是读不到了吧?我想判断是不是最后一条。)

解决方案 »

  1.   

    cursor_name%FOUND如果最近一次提取游标操作FETCH成功则为TRUE,否则为FALSE。当在游标打开之后、提取之前问%FOUND时,返回null;当在游标打开之前访问%FOUDN时,将引起INVALID_CURSOR异常。
    cursor_name%NOTFOUND如果最近一次提取游标操作FETCH失败则为true,否则为false。
    所以楼主可以根据这个两个属性fetch的成功与否来判断是不是最后一条。
      

  2.   

    使用  SQL%ROWCOUNT,这个变量返回你的游标的结果集的总数。只要再自定义一个计数变量和它比较即可。  如果相等就是最后一条了。
      

  3.   

    声明一个临时计数变量 i,然后每从游标里读一次纪录就加1,如果是最后一条记录,那么i会等于 %ROWCOUNT 的值 ...试试~~
      

  4.   

    sqlca裡有一個成員是表示執行的條數的..
      

  5.   

    改写一下游标
    select * from 
    (select rownum aaa, ... from ... order by aaa desc)
    where rownum <=1;
    不就能得到最后一条了吗?
      

  6.   

    回复:sanmmu
    %FOUDN和%NOTFOUND已经是最后一条的后面了,我就是想在最后一条的时候进行一些操作。
    回复:fenixshadow  and   mantisXF
    SQL%ROWCOUNT不是总行数,是我的程序的问题?还是版本的问题?(oracle 10g)
    程序:
    CREATE OR REPLACE PROCEDURE TESTN
    IS
        cTMP_COL TEST_02.COL1%TYPE;
        CURSOR cur_TEST IS 
            SELECT COL1 FROM TEST_02;
    BEGIN
        OPEN cur_TEST;
        DBMS_OUTPUT.PUT_LINE('*****SQL%ROWCOUNT**********************==' || SQL%ROWCOUNT || '==');
        DBMS_OUTPUT.PUT_LINE('*****cur_TEST%ROWCOUNT*****************==' || cur_TEST%ROWCOUNT || '==');    LOOP
            FETCH cur_TEST INTO cTMP_COL;
            EXIT WHEN cur_TEST %NOTFOUND;
            DBMS_OUTPUT.PUT_LINE('SQL%ROWCOUNT==' ||  SQL%ROWCOUNT || '==');
            DBMS_OUTPUT.PUT_LINE('cur_TEST%ROWCOUNT==' ||  cur_TEST%ROWCOUNT || '==');
        END LOOP;
    END;
    /
    输出结果:【 DBMS_OUTPUT 値 】
    *****SQL%ROWCOUNT**********************====
    *****cur_TEST%ROWCOUNT*****************==0==
    SQL%ROWCOUNT====
    cur_TEST%ROWCOUNT==1==
    SQL%ROWCOUNT====
    cur_TEST%ROWCOUNT==2==
    SQL%ROWCOUNT====
    cur_TEST%ROWCOUNT==3==
    SQL%ROWCOUNT====
    cur_TEST%ROWCOUNT==4==
    SQL%ROWCOUNT====
    cur_TEST%ROWCOUNT==5==
    SQL%ROWCOUNT====
    cur_TEST%ROWCOUNT==6==
    SQL%ROWCOUNT====
    cur_TEST%ROWCOUNT==7==
    SQL%ROWCOUNT====
    cur_TEST%ROWCOUNT==8==
    SQL%ROWCOUNT====
    cur_TEST%ROWCOUNT==9==
    SQL%ROWCOUNT====
    cur_TEST%ROWCOUNT==10==回复:wang_wuhui
    可以详细说说吗?回复:bjt_
    我不是只要最后一条,是想到最后一条的时候做某些操作
    拿到循环外面做太麻烦,有没有办法提前先得到纪录条数,提前执行SQL文求COUNT(*)的方法可以,我只是觉得这个方法太笨,而且浪费效率,我记得8i里是不可以的,10g里不知道有没有更好的方法。
      

  7.   

    daclare   num   number(1000);   
      num:=0;   
      loop   
      num:=num+1;   
      when     num=mycursor%rowcount-1   then   
          RAISE_APPLICATION_ERROR   (-20205,   
      '这是最后一条记录');   
      fetch   mycursor   ........   
      .............   
        
      exit   when   mycursor%nofound;   
      end   loop;
      

  8.   

    回复:wang_wuhui
    可以详细说说吗?回复:bjt_
    我不是只要最后一条,是想到最后一条的时候做某些操作
    -----------------------------
    引用lz的部门话,如果是那么个意思.那么简单的修改程序体即可.
    作个简化的过程declare
       r sys_refcursor;
       vRow  tab%rowtype;
       vName tab.tname%type;
       vAmount int;
    begin
       open r for select * from tab where tname like 'T%';
       vAmount:=0;
       fetch r into vRow;
       while r%found loop
          vAmount:=vAmount+1;
          .....
          fetch r into vRow;
       end loop;
       if vAmount>0 then  --处理最后一条记录.   end if;
    end if;
      

  9.   

    declare
       r sys_refcursor;
       vRow  tab%rowtype;
       vName tab.tname%type;
       vAmount int;
    begin
       open r for select * from tab where tname like 'T%';
       vAmount:=0;
       fetch r into vRow;
       while r%found loop
          vAmount:=vAmount+1;
          .....
          fetch r into vRow;
       end loop;
       if vAmount>0 then  --处理最后一条记录.
            --vrow就是最后一条记录,楼主可以随便处理的
       end if;
    end if;
      

  10.   

    取游标的时候加一个rownum字段,每次取数的时候比较一下,如果字段等于最大记录数的时候就可以判定为最后一个
      

  11.   

    %rowcount 属性不是游标纪录的总共行数,而是指迄今为止从游标中取出的行数,也就是说从LOOP开始到现在正在读取游标时,已经读取纪录的行数。从游标中读取一条记录,rowcount加1。