DECLARE
   TYPE t_oo IS TABLE OF dba_objects.owner%TYPE;
   TYPE t_on IS TABLE OF dba_objects.object_name%TYPE;
   l_oo   t_oo;
   l_on   t_on;
   tcount number(3) := 0;
   CURSOR c1
   IS
      SELECT owner, object_name
        FROM dba_objects
       WHERE ROWNUM <=1000;
BEGIN
   OPEN c1;
   LOOP      FETCH c1
      BULK COLLECT INTO l_oo, l_on LIMIT 10000;
      EXIT WHEN c1%NOTFOUND;
tcount := tcount +1 ;
   END LOOP;
   CLOSE c1;
   dbms_output.put_line(tcount);
END;
/0PL/SQL 过程已成功完成。
按道理应该出来的结果是1啊,为什么是0啊?

解决方案 »

  1.   

    tcount := tcount +1 ;没执行到 BULK COLLECT INTO l_oo, l_on LIMIT 10000;
     tcount := tcount +1 ;
     EXIT WHEN c1%NOTFOUND;
      

  2.   

    按道理应该执行到了啊,第一次循环的时候,c1%NOTFOUND这个语句应该是FALSE啊,所以应该不会EXIT,应该执行了后面那个加法啊
      

  3.   


    --哥哥你测试一下不就知道了。
    DECLARE
      TYPE t_oo IS TABLE OF dba_objects.owner%TYPE;
      TYPE t_on IS TABLE OF dba_objects.object_name%TYPE;
      l_oo t_oo;
      l_on t_on;
      tcount number(3) := 0;
      CURSOR c1
      IS
      SELECT owner, object_name
      FROM dba_objects
      WHERE ROWNUM <=1000;
    BEGIN
      OPEN c1;
      LOOP  FETCH c1
      BULK COLLECT INTO l_oo, l_on LIMIT 10000;
      dbms_output.put_line('aaaaaa!');
      EXIT WHEN c1%NOTFOUND;
      dbms_output.put_line('bbbbbb!');
      tcount := tcount +1 ;
      END LOOP;
      CLOSE c1;
      dbms_output.put_line(tcount);
    END;
    /
      

  4.   

    为什么第一次循环时执行EXIT WHEN c1%NOTFOUND就退出了啊
      

  5.   

    SELECT owner, object_name
      FROM dba_objects
      WHERE ROWNUM <=1000;
    --查询出来有没有数据?
      

  6.   

    FETCH c1
      BULK COLLECT INTO l_oo, l_on LIMIT 1000;改为:FETCH c1
       INTO l_oo, l_on LIMIT 1000;来测试一下看看
      

  7.   

    BULK COLLECT可以做为费时的DML语句的替代,可以在一次操作中返回整个结果集。
    所以根据不会对%NOTFOUND进行赋值,所以从%NOTFOUND无法判断已经到达记录的末尾。
      

  8.   

    错~,你把楼主的sql中的10000改成 100你试试看。。