遊標+bulk collect into limit的不同方法查詢資料

flzhang發表於2016-04-06

如下需求想在查詢表時先根據bulk collect into方式查詢表中部分資料,然後處理,在查詢表中其餘資料知道查詢出表中所有資料

如一個表有6條資料,第一次次批量取3條,顯示後再批量取3條,已顯示遊標方式查詢

具體構建環境

create TABLE TEST.COURSE
(      COURSE_NO NUMBER(38),
       DESCRIPTION VARCHAR2(50),
       COST NUMBER(9,2),
       PREREQUISITE NUMBER(8),
       CREATED_BY VARCHAR2(30),
       CREATED_DATE DATE,
       MODIFIED_BY VARCHAR2(30),
       MODIFIED_DATE DATE)
      
       INSERT INTO TEST.COURSE VALUES
       (
         1,'22223',1,1,'20150101',SYSDATE,'20150101',SYSDATE
       );
       INSERT INTO TEST.COURSE VALUES
       (
         2,'22223',1,1,'20150101',SYSDATE,'20150101',SYSDATE
       );
       INSERT INTO TEST.COURSE VALUES
       (
         3,'22223',1,1,'20150101',SYSDATE,'20150101',SYSDATE
       );
       INSERT INTO TEST.COURSE VALUES
       (
         4,'22223',1,1,'20150101',SYSDATE,'20150101',SYSDATE
       );
       INSERT INTO TEST.COURSE VALUES
       (
         5,'22223',1,1,'20150101',SYSDATE,'20150101',SYSDATE
       );
       INSERT INTO TEST.COURSE VALUES
       (
         6,'22223',1,1,'20150101',SYSDATE,'20150101',SYSDATE
       );


採用rowtype型別查詢

DECLARE
   rn number;
   CURSOR course_cur IS
   SELECT * --注意此處如果cur_result遊標結果是錶行型別的,要查詢所有欄位,但如果是type就要查詢出對應具體欄位
   FROM TEST.COURSE;
    
   type delArray1 is table of TEST.COURSE%ROWTYPE index by binary_integer; --ROWTYPE表示表中一行的記錄型別
   --type delArray1 is table of TEST.COURSE.COURSE_NO%TYPE index by binary_integer;
   cur_result delArray1;
   BEGIN
   rn := 2;
   OPEN course_cur;
    for i in 1..3 loop
      FETCH course_cur bulk collect into  cur_result limit rn;
       for i in 1..rn loop
         DBMS_OUTPUT.PUT_LINE ('loop COURSE_NO1:   '||cur_result(i).COURSE_NO);
       end loop;
       DBMS_OUTPUT.PUT_LINE ('commit ' );
     
   END LOOP;
   close course_cur;
  
END;


採用type型別查詢

DECLARE
   rn number;
   CURSOR course_cur IS
   SELECT course_no --注意此處如果cur_result遊標結果不是錶行型別的,是type就要查詢出對應具體欄位
   FROM TEST.COURSE;
    
   --type delArray1 is table of TEST.COURSE%ROWTYPE index by binary_integer;
   type delArray1 is table of TEST.COURSE.COURSE_NO%TYPE index by binary_integer;--%TYPE實際對應表中一列的資料型別
   cur_result delArray1;
   BEGIN
   rn := 2;
   OPEN course_cur;
    for i in 1..3 loop
      FETCH course_cur bulk collect into  cur_result limit rn;
       for i in 1..rn loop
         DBMS_OUTPUT.PUT_LINE ('loop COURSE_NO1:   '||cur_result(i));
       end loop;
       DBMS_OUTPUT.PUT_LINE ('commit ' );
     
   END LOOP;
   close course_cur;
  
END;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/750077/viewspace-2075986/,如需轉載,請註明出處,否則將追究法律責任。

相關文章