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

oracle 之关键词 bulk collect

阅读更多

通过bulk collect减少loop处理的开销


     type wkas_row is record(a number(12), b number(12));
     type tbl_wkas is table of wkas_row;
     v_wkas tbl_wkas;


begin
    select a,b bulk collect into v_wkas
    from tbl_t
    where t='aaaaaa'
exception when others then
   null;
end;


批量处理数据,用于数据量大的时候来提高性能。


采用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;

 

为了测试returning into 关键字:


 CREATE TABLE loginuser(username VARCHAR2(20),passwd VARCHAR2(20))
 
 create or replace Procedure p_test_pro1 AS
   begin
        for v_i in 0..10 loop
        insert into loginuser values('admin'||v_i,'123456');
        end loop;
   end;
       
 create or replace Procedure p_test_pro1 AS
 TYPE namelist IS TABLE OF loginuser.username%TYPE;
 TYPE passwdlist IS TABLE OF loginuser.passwd%TYPE;
 nlist namelist;
 plist passwdlist;
 
 begin
   DELETE FROM loginuser WHERE ROWNUM<4 --删除操作测试
   RETURNING username,passwd BULK COLLECT INTO
   nlist,plist;
   dbms_output.put_line(SQL%ROWCOUNT);
  
   FOR i IN nlist.first..nlist.last
     LOOP
        dbms_output.put_line(nlist(i)||'----'||plist(i)); 
     END LOOP;
 end;

 

CREATE OR REPLACE Procedure p_test_pro1 AS
 TYPE namelist IS TABLE OF loginuser.username%TYPE;
 TYPE passwdlist IS TABLE OF loginuser.passwd%TYPE;
 nlist namelist;
 plist passwdlist;

 begin
--   DELETE FROM loginuser WHERE ROWNUM<4
  UPDATE loginuser t SET t.passwd='123'  --修改操作测试
   RETURNING username,passwd BULK COLLECT INTO
   nlist,plist;
   dbms_output.put_line(SQL%ROWCOUNT);

   FOR i IN nlist.first..nlist.last
     LOOP
        dbms_output.put_line(nlist(i)||'----'||plist(i));
     END LOOP;
 end;

分享到:
评论

相关推荐

    Oracle 中使用 fetch bulk collect into 批量效率的读取游标数据

    Oracle 中使用 fetch bulk collect into 批量效率的读取游标数据 Oracle 中的游标数据读取是数据库开发中非常常见的操作。通常,我们使用 fetch some_cursor into var1, var2 形式来获取游标数据,当游标中的记录数...

    oracle批量处理(bulk collect)

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

    使用BULK COLLECT, MERGE 语句提高sql执行效率

    详细介绍了使用 BULK COLLECT 进行批量操作 提高sql的执行效率 使用MERGE INTO USING 一条sql搞定 新增和修改 使用connect by 进行递归树查询

    oracle bulk collect

    根据提供的文件信息,我们可以深入探讨Oracle中的`BULK COLLECT`功能及其在实际场景中的应用。这段代码示例虽然较为杂乱,但可以提炼出的关键点主要包括:如何使用`BULK COLLECT`来提高查询效率、如何声明和使用表...

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

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

    bulk collect学习

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

    bulk collect 使用实例

    结合一个存储过程的实例,介绍了 bulk collect 的使用

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

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

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

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

    sal,ename BULK COLLECT INTO

    在提供的代码片段中,“sal,ename BULK COLLECT INTO”这一表述并未直接出现在代码中,但从整体上下文来看,这里主要涉及的是Oracle数据库中的PL/SQL语言,特别是`BULK COLLECT INTO`这一关键字及其应用场景。...

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

    本文主要讨论了两个核心的批处理特性:BULK COLLECT 和 FORALL,它们对于优化PL/SQL程序的效率有着显著的贡献。 BULK COLLECT 是一个用于加速查询的特性,它允许一次性地将查询结果集加载到集合(collections)中,...

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

    - 在实际应用中,BULK COLLECT常用于减少数据库调用次数,提高大量数据处理的效率。 总结来说,Oracle遍历游标的方式有其各自的特点和适用场景。FOR循环简洁易用,适用于大多数情况;FETCH和WHILE循环提供了更精细...

    Oracle Bulk Binds技术分析.pdf

    Oracle Bulk Binds技术是一种优化数据库操作性能的策略,尤其适用于处理大量数据的场景。批量绑定技术的核心在于减少PL/SQL和SQL引擎之间的上下文切换次数,从而提高效率。在传统的SQL语句执行过程中,每次SQL的执行...

    oracle 迅速查询和更新大数据

    在Oracle数据库管理中,对于大数据量的处理是常见且重要的任务之一。特别是在需要对大量数据进行高效查询和更新操作时,如何优化性能成为了开发人员和技术团队必须面对的挑战。本文将基于提供的示例代码,深入探讨...

    oracle删除数据方法。

    2. **BULK COLLECT**: 这是Oracle提供的一个特性,允许一次性从查询结果集中获取多行记录,从而提高处理效率。 3. **FOR ALL** 语句:这是一种特殊的循环结构,可以在循环中执行DDL/DML等操作,如更新、删除等,从而...

    oracle dba quan gong lue

    这段代码首先定义了一个类型`emp_table_type`来存储`employees`表的数据行,然后通过`BULK COLLECT`一次性检索出符合条件的所有行数据,并输出相关信息。 #### 2. 查询最高薪水员工 此外,还可以使用BULK COLLECT来...

    oracle游标使用及实例

    `BULK COLLECT`允许一次性从游标中获取多行数据,并存储到集合中,这可以显著提高性能。 首先定义一个集合类型: ```sql TYPE type_name IS TABLE OF data_type; ``` 接着定义一个该类型的变量: ```sql ...

Global site tag (gtag.js) - Google Analytics