打个比方:
  
   type c_type is ref cursor;
    c_type c;
   sql:=select*from temp   open c for sql;
  
  
   请问怎么样可以得到游标c中记录数;不去表里查,c.什么,可以得到吗?

解决方案 »

  1.   

    用bulk collect把游标一次性读入pl/sql表变量中,然后从pl/sql表变量中就能得到纪录数:--建立测试表SQL> CREATE TABLE tbl_test
      2  (ID INTEGER);Table created.--插入测试纪录
    SQL> BEGIN
      2     FOR i IN 1 .. 100
      3     LOOP
      4        INSERT INTO tbl_test
      5             VALUES (i);
      6     END LOOP;
      7  END;
      8  /PL/SQL procedure successfully completed.SQL> SET serveroutput on size 10000--测试过程
    SQL> DECLARE
      2     TYPE c_type IS REF CURSOR;
      3     c        c_type;
      4  
      5     TYPE tbl_type IS TABLE OF tbl_test.ID%TYPE; --定义pl/sql表变量类型
      6  
      7     v_temp   tbl_type;  --定义pl/sql表变量类型
      8  
      9  BEGIN
     10  
     11     OPEN c FOR select id from tbl_test;
     12  
     13     FETCH c
     14     BULK COLLECT INTO v_temp;  --bulk collect进表变量
     15  
     16     CLOSE c;
     17  
     18     DBMS_OUTPUT.put_line ('count:' || v_temp.COUNT);
     19  END;
     20  /
    count:100  --获得纪录数PL/SQL procedure successfully completed.
      

  2.   

    c%rowcount  就是获取游标的记录数。
      

  3.   

    KingSunSha(弱水三千) v_temp.COUNT是不是绑定的记录数?
      

  4.   

    c%rowcount必须通过fetch操作到纪录集末才能得到整个纪录集的纪录数。v_temp.COUNT是v_temp这个pl/sql table变量的upper bound(我都不知道这个词怎么翻译,大概可以认为是数组的上界)。