Có vẻ như cú pháp THỰC HIỆN NGAY LẬP TỨC không cho phép LIMIT trong mệnh đề thu thập hàng loạt
http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/executeim Instant_statement.htm#CJACGJJG
số lượng lớn_collect_into_clause
http://docs.oracle .com / cd / E11882_01 / appdev.112 / e25519 / returninto_clause.htm # CJAIAGHJ
Bạn có thể sử dụng con trỏ và lệnh FETCH .. LIMIT cùng với lệnh OPEN..FOR,
theo cách này:
DECLARE
....
cur sys_refcursor;
BEGIN
v_query := 'SELECT level AS x FROM dual CONNECT BY LEVEL <=10';
OPEN cur FOR v_query;
LOOP
FETCH cur BULK COLLECT INTO collection LIMIT 3;
EXIT WHEN collection.COUNT = 0;
/* Process data from `collection` */
END LOOP;
CLOSE cur;
END;
Ví dụ:
DECLARE
TYPE col_typ IS table of NUMBER;
collection col_typ;
v_query varchar2(3000);
cur sys_refcursor;
i int := 0;
x int;
BEGIN
v_query := 'SELECT level AS x FROM dual CONNECT BY LEVEL <=10';
OPEN cur FOR v_query;
LOOP
FETCH cur BULK COLLECT INTO collection LIMIT 3;
EXIT WHEN collection.COUNT = 0;
/* Process data from `collection` */
i := i + 1;
DBMS_OUTPUT.PUT_LINE('==== Batch nbr #' || i );
FOR x IN 1 .. collection.COUNT LOOP
DBMS_OUTPUT.PUT_LINE( collection( x ) );
END LOOP;
END LOOP;
CLOSE cur;
END;
/
Kết quả:
==== Batch nbr #1
1
2
3
==== Batch nbr #2
4
5
6
==== Batch nbr #3
7
8
9
==== Batch nbr #4
10