新博客http://www.cnblogs.com/zhjh256 欢迎访问
分类: Oracle
2008-01-06 21:09:24
使用BULK COLLECT代替Cursor FOR
当从Oracle查询多行时,不要使用FOR循环,而是使用BULK COLLECT,可以极大的提高系统的性能,如下:
DECLARE
TYPE employee_aat IS TABLE OF employee%ROWTYPE
INDEX BY BINARY_INTEGER;
l_employees employee_aat;
BEGIN
SELECT *
BULK COLLECT INTO l_employees
FROM employee;
END;
当然,如果数据很多,可以使用BULK COLLECT的LIMIT子句(否则会消耗大量的内存),如下:
DECLARE
TYPE employee_aat IS TABLE OF employee%ROWTYPE
INDEX BY BINARY_INTEGER;
l_employees employee_aat;
CURSOR employees_cur IS SELECT * FROM employee;
BEGIN
OPEN employees_cur;
FETCH employees_cur
BULK COLLECT INTO l_employees LIMIT 100;
EXIT WHEN l_employees.COUNT = 0;
-- Process these 100 rows and then
-- move on to next 100.
END
END;
需要注意的是:使用BULK COLLECT时,NO_DATA_FOUND异常不会抛出,即使没有数据返回。并且在LIMIT中,不要依赖cursor%FOUND确定提取数据,相反,需要检查集合中的内容。