declare
   cursor tab_cur is
     select * from tab;   type row_type is table of integer;
   row_tab row_type;
 loop
   fetch tab_cur
     bulk collect into row_tab limit 2;   exit when row_tab.count=0;
   
   for i in row_tab.first..row_tab.last
   loop
     null;
   end loop; end loop;
想问下,外部循环条件,为什么可以用row_tab.count=0作为判别条件?因为分批次取数据,row_tab肯定存有之前取的数据,用row_tab.count=0作为判别条件感觉会进入死循环,但是结果反而是可以作为判别.

解决方案 »

  1.   

    fetch tab_cur
         bulk collect into row_tab limit 2;每fetch一次,tab_cur记录少两条。
      

  2.   

    fetch tab_cur
         bulk collect into row_tab limit 2;
    每次读取数据时会清空row_tab,所以游标tab_cur读到最后没有数据时tab_cur中自然也没有数据了
      

  3.   


    row_tab是集合类型,为什么会读取数据后,清空呢?
      

  4.   

    fetch tab_cur bulk collect into row_tab limit 2;
    会重新从游标里讲数据插入到 raw_tab 中,当游标 %notfound ,raw_tab 里也不会有数据,所以 count = 0
      

  5.   


    每次读取操作之前,row_tab读取了数据.那批数据会清空的吗
      

  6.   

    是滴,你可以自己测试下。
    DECLARE
      CURSOR TAB_CUR IS
        SELECT TNAME FROM TAB;  TYPE ROW_TYPE IS TABLE OF VARCHAR2(30);
      ROW_TAB ROW_TYPE;
    BEGIN
      OPEN TAB_CUR;  LOOP    FETCH TAB_CUR BULK COLLECT
          INTO ROW_TAB LIMIT 1;
        
        DBMS_OUTPUT.PUT_LINE('2:'||ROW_TAB.COUNT);
        
        EXIT WHEN ROW_TAB.COUNT = 0;
      
        FOR I IN ROW_TAB.FIRST .. ROW_TAB.LAST LOOP
          DBMS_OUTPUT.PUT_LINE(ROW_TAB(I));
        END LOOP;    DBMS_OUTPUT.PUT_LINE('1:'||ROW_TAB.COUNT);
      END LOOP;
    END;