forall values in values of collection:就是从集合中迭代存储的元素值,循环体内直接使用 values就是元素值了,一般用于嵌套集合。
forall indxes in indices of collection:迭代的不是元素值,是元素在集合中的索引值。通过collection(indxes)得到集合的值,10g新增可以访问非连续集合。
--indices of
DECLARE
TYPE ID_TABLE_TYPE IS TABLE OF NUMBER(6);--嵌套表
ID_TABLE ID_TABLE_TYPE;
BEGIN
ID_TABLE:=ID_TABLE_TYPE(1,NULL,3,NULL,5);--构造初始化
FORALL I IN INDICES OF ID_TABLE
DELETE FROM DEMO WHERE ID=ID_TABLE(I);
END;
--VALUES OF
CREATE TABLE NEW_DEMO AS SELECT * FROM DEMO WHERE 1=0;
DECLARE
TYPE ID_TABLE_TYPE IS TABLE OF DEMO.ID%TYPE;
TYPE NAME_TABLE_TYPE IS TABLE OF DEMO.NAME%TYPE;
NAME_TABLE NAME_TABLE_TYPE;
ID_TABLE ID_TABLE_TYPE;
TYPE INDEX_POINTER_TYPE IS TABLE OF PLS_INTEGER;
INDEX_POINTER INDEX_POINTER_TYPE;
BEGIN
SELECT * BULK COLLECT INTO ID_TABLE,NAME_TABLE FROM DEMO;
INDEX_POINTER:=INDEX_POINTER_TYPE(6,8,10);
FORALL I IN VALUES OF INDEX_POINTER
INSERT INTO NEW_DEMO VALUES(ID_TABLE(I),NAME_TABLE(I));
END;
对bulk collect作个小小解析:
通过bulk collect减少loop处理的开销, 使用Bulk Collect提高Oracle查询效率
通过bulk collect减少loop处理的开销, 使用Bulk Collect提高Oracle查询效率
Oracle8i中首次引入了Bulk Collect特性,该特性可以让我们在PL/SQL中能使用批查询,批查询在某些情况下能显著提高查询效率。
采用bulk collect可以将查询结果一次性地加载到collections中。
而不是通过cursor一条一条地处理。
可以在select into,fetch into,returning into语句使用bulk collect。
注意在使用bulk collect时,所有的into变量都必须是collections.