`
qieyi28
  • 浏览: 157118 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

oracle学习之bulk collect用法

 
阅读更多
通过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.
 

举几个简单的例子:
--在select into语句中使用bulk collect

DECLARE
TYPE SalList IS TABLE OF emp.sal%TYPE;
sals SalList;
BEGIN
-- Limit the number of rows to 100.
SELECT sal BULK COLLECT INTO sals FROM emp
WHERE ROWNUM <= 100;
-- Retrieve 10% (approximately) of the rows in the table.
SELECT sal BULK COLLECT INTO sals FROM emp SAMPLE 10;

END;
/

--在fetch into中使用bulk collect

DECLARE
TYPE DeptRecTab IS TABLE OF dept%ROWTYPE;
dept_recs DeptRecTab;
CURSOR c1 IS
SELECT deptno, dname, loc FROM dept WHERE deptno > 10;
BEGIN
OPEN c1;
FETCH c1 BULK COLLECT INTO dept_recs;
END;
/

--在returning into中使用bulk collect

CREATE TABLE emp2 AS SELECT * FROM employees;
DECLARE
TYPE NumList IS TABLE OF employees.employee_id%TYPE;
enums NumList;
TYPE NameList IS TABLE OF employees.last_name%TYPE;
names NameList;
BEGIN
DELETE FROM emp2 WHERE department_id = 30
RETURNING employee_id, last_name BULK COLLECT INTO enums, names;
dbms_output.put_line('Deleted ' || SQL%ROWCOUNT || ' rows:');
FOR i IN enums.FIRST .. enums.LAST
LOOP
dbms_output.put_line('Employee #' || enums(i) || ': ' || names(i));
END LOOP;
END;
/
DROP TABLE emp2;
 通过上面的测试和分析,我们可以看到Bulk 
Collect批查询在某种程度上可以提高查询效率,它首先将所需数据读入内存,然后再统计分析,这样就可以提高查询效率。但是,如果Oracle数据库的内存较小,Shared 
Pool Size不足以保存Bulk Collect批查询结果,那么该方法需要将Bulk Collect的集合结果保存在磁盘上,在这种情况下,Bulk 
Collect方法的效率反而不如其他两种方法,有兴趣的读者可以进一步测试。

另外,除了Bulk Collect批查询外,我们还可以使用FORALL语句来实现批插入、删除和更新,这在大批量数据操作时可以显著提高执行效率。

分享到:
评论

相关推荐

    oracle批量处理(bulk collect)

    ### Oracle批量处理(Bulk Collect) #### 一、概述 在Oracle数据库中,`BULK COLLECT` 是一种高效的数据检索机制,它允许一次性从数据库中提取多行数据,并将其存储在一个PL/SQL集合中。与传统的游标逐行处理相比,...

    oracle bulk collect

    尽管示例代码中并未明确展示`BULK COLLECT`的使用方法,但我们可以通过以下示例来理解其用法: ```sql DECLARE TYPE Emp_Table IS TABLE OF EMPLOYEE%ROWTYPE; emp_table Emp_Table := Emp_Table(); BEGIN ...

    bulk collect学习

    总结来说,理解并熟练使用 Bulk Collect 是优化 Oracle 数据库性能的关键步骤之一。在处理大量数据时,通过减少数据库调用和提高内存利用率,可以显著提升查询和数据操作的速度。同时,合理地利用 FORALL 和 Bulk ...

    oracle下巧用bulk collect实现cursor批量fetch的sql语句

    在Oracle数据库中,Bulk Collect是一个非常实用的特性,它允许我们一次从游标(Cursor)中批量地获取多行数据,极大地提高了处理大量数据时的性能。本文将深入讲解如何在PL/SQL中使用Bulk Collect实现Cursor的批量...

    Oracle批量查询、删除、更新使用BULK COLLECT提高效率

    Oracle数据库提供了一种高效的方法来处理批量操作,如查询、删除和更新,这就是BULK COLLECT和数组集合类型的使用。BULK COLLECT是PL/SQL中的一个关键字,它允许我们一次性收集多行数据,而不是逐行处理,从而显著...

    Oracle BULK COLLECT批量取数据解决方法

    Oracle BULK COLLECT 是一种在PL/SQL中用于优化数据处理的方法,特别是在处理大量数据时。这个特性允许一次性从数据库中获取多个记录,而不是传统的单行迭代方式,从而显著提高性能。在给定的示例代码中,展示了如何...

    sal,ename BULK COLLECT INTO

    #### 三、BULK COLLECT INTO 的语法与用法 **基本语法格式:** ```sql DECLARE CURSOR cursor_name IS SELECT column_list FROM table_or_view WHERE condition; type_type TYPE IS TABLE OF column_name%...

    浅谈PL/SQL批处理语句:BULK COLLECT与FORALL对优化做出的贡献

    以下是一些BULK COLLECT的基本用法: 1. **在SELECT INTO语句中使用BULK COLLECT**: 当需要从表中获取多行数据时,传统的做法是通过游标(cursor)逐行处理。但使用BULK COLLECT,我们可以直接将结果集加载到集合...

    ORACLE数组使用方法

    ORACLE 数组使用方法 Oracle 数组是一种复杂的数据类型,可以存储多个元素,数组可以分为固定数组和可变数组两种类型。在 Oracle 中,数组可以用来存储大量的数据,并且可以通过索引来访问数组中的元素。 固定数组...

    学习oracle必备例表

    学习者可以通过执行这个脚本来学习如何使用INSERT语句,以及批量插入数据的方法,比如使用BULK COLLECT和INTO子句。同时,这也有助于理解如何处理日期、数字、字符串等不同数据类型的值。 3. **del_data.sql**: ...

    oracle删除数据方法。

    - 使用 `BULK COLLECT` 将游标中的结果一次性读取到 `V_ROWID_ARRAY` 数组中,这里限制了每次最多读取10000条记录。 3. **批量删除数据**: ```sql FORALL I IN 1..V_ROWID_ARRAY.COUNT DELETE FROM A WHERE ...

    oracle 迅速查询和更新大数据

    综上所述,通过使用批量处理技术、引用游标以及SQL性能优化技巧等方法,可以有效地提高Oracle数据库在处理大数据时的查询和更新性能。这些技术的应用不仅能够提高系统的响应速度,还能增强其稳定性和可靠性。

    oracle 中 pl/sql 只是学习方法

    8. **游标表达式(Cursor Expressions)和Bulk Collect**:游标表达式简化了游标的使用,而Bulk Collect则允许一次收集多行数据,提高了批量操作的效率。 9. **索引和触发器**:虽然不是PL/SQL语言本身的一部分,但...

    oracle dba quan gong lue

    BULK COLLECT是一种高效的批量数据检索方法,可以显著提高查询性能。以下是一个具体的示例: ```sql -- 使用BULK COLLECT查询部门ID为50的所有员工 DECLARE TYPE emp_table_type IS TABLE OF employees%ROWTYPE; ...

    Oracle 遍历游标的四种方式汇总(for、fetch、while、BULK COLLECT)

    在Oracle数据库中,遍历游标是处理查询结果集的一种常见方法,特别是在编写存储过程或PL/SQL块时。游标允许我们逐行处理查询结果,而不会一次性加载所有数据,这对于大型数据集来说非常高效。以下是Oracle遍历游标的...

    Oracle数据库游标使用.rar

    Oracle数据库游标是数据库编程中的一个重要概念,尤其在处理大量数据时,它们提供了一种有效且灵活的方法。游标允许程序逐行访问查询结果集,而不是一次性加载所有数据。这在处理复杂的数据操作,如循环处理、条件...

    Oracle使用疑难问题汇总

    教程名称:Oracle使用疑难问题汇总课程目录:【】Oracle DBA优化数据库性能心得体会【】ORACLE 中ROWNUM用法总结【】Oracle 查询表空间使用情况(经典篇)【】Oracle下巧用bulk collect实现cursor批量fetch【】...

Global site tag (gtag.js) - Google Analytics