`
oaklet
  • 浏览: 108873 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

oracle bulk collect into 的几种用法

阅读更多
bulk collect 和 forall 联合应用写起来显得有些啰嗦,不过为了速度,多写两句又何妨

建立两个临时表
create table T_TEST
(
  TESTID      NUMBER(19) not null,
  TESTNAME    VARCHAR2(512),
  TESTTYPE    VARCHAR2(512),
  TESTLEVEL   VARCHAR2(512),
  ADDFLAG     VARCHAR2(512)
);
create table T_TEST2
(
  TESTID      NUMBER(19) not null,
  TESTNAME    VARCHAR2(512),
  TESTTYPE    VARCHAR2(512),
  TESTLEVEL   VARCHAR2(512),
);

存储过程使用示例1:
create or replace procedure FAST_UP_TEST is
TYPE TARR is table of T_TEST%ROWTYPE;
vvrr TARR;
CURSOR curr is select * from T_TEST where ADDFLAG='add';
begin
  open curr;
  loop
    fetch curr bulk collect into vvrr limit 1000;
    dbms_output.put_line('增加:'||vvrr.count);
    forall i in 1..vvrr.count
      update T_TEST2
      set TESTTYPE=vvrr(i).TESTTYPE,TESTLEVEL=vvrr(i).TESTLEVEL 
      where TESTNAME=vvrr(i).TESTNAME and TESTID=vvrr(i).TESTID;
      commit;
    exit when curr%NOTFOUND;
  end loop;
  close curr;
end;

换一个方式使用示例(注意游标返回类型变化):
create or replace procedure FAST_DEL_TEST is
TYPE TARR is table of T_TEST.TESTID%TYPE;
vvrr TARR;
CURSOR curr is select TESTID from T_TEST where ADDFLAG='delete';
begin
  dbms_output.enable(90000);
  open curr;
  loop
    fetch curr bulk collect into vvrr limit 1000;
    dbms_output.put_line('delete T_TEST '||vvrr.count);
    forall i in 1..vvrr.count
      delete T_TEST2
      where TESTID=vvrr(i);
      commit;
    exit when curr%NOTFOUND;
  end loop;
  close curr;
end;


多参数返回的另一种用法和动态sql运行办法
create or replace procedure FAST_AD_TEST (
  tabtest in VARCHAR2) is
TYPE TARR_ID is table of T_TEST.TESTID%TYPE;
TYPE TARR_NM is table of T_TEST.TESTNAME%TYPE;
TYPE TARR_TP is table of T_TEST.TESTTYPE%TYPE;
vvid TARR_ID;
vvnm TARR_NM;
vvtp TARR_TP;
CURSOR curr is select TESTID,TESTNAME,TESTTYPE from T_TEST where ADDFLAG='add';
CURSOR curd is select TESTID from T_TEST where ADDFLAG='delete';
begin
  execute immediate 'truncate table '||tabtest;
  -- forall只能写一条sql。。。
  open curr;
  loop
    fetch curr bulk collect into vvid,vvnm,vvtp limit 1000;
    forall i in 1..vvid.count
      insert into T_TEST2(TESTID,TESTNAME,TESTTYPE) values (vvid(i),vvnm(i),vvtp(i));
      commit;
    exit when curr%NOTFOUND;
  end loop;
  close curr;
  -- 动态传入表名和参数
  open curd;
  loop
    fetch curd bulk collect into vvid limit 1000;
    forall i in 1..vvid.count
      execute immediate 'delete '||tabtest||' where TESTID=:tabid' using in vvid(i);
      commit;
    exit when curd%NOTFOUND;
  end loop;
  close curd;
end;



bulk collect 和 forall 的联合应用
基本上压榨出了oracle中增删改的极限速度。

比用游标一条条处理要快太多了。
分享到:
评论

相关推荐

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

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

    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, MERGE 语句提高sql执行效率

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

    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%...

    bulk collect学习

    在 Oracle8i 中引入的 Bulk Collect 特性,适用于 select into、fetch into 和 returning into 语句。例如: 1. **在 select into 语句中使用 bulk collect**: 在这个示例中,我们创建了一个名为 SalList 的表...

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

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

    bulk collect 使用实例

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

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

    BULK COLLECT(成批聚合类型)和数组集合type类型is table of 表%rowtype index by binary_integer用法笔记。 例1: 批量查询项目资金账户号为 “320001054663”的房屋账户信息并把它们打印出来 . DECLARE TYPE acct_...

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

    接着,使用 `bulk collect into` 语句从Cursor中一次性获取多行数据,并分别存入 `v_code` 和 `v_name` 集合中。最后,通过循环遍历集合并打印出数据。 更简洁的方法是,我们可以定义一个包含整个记录类型的集合,...

    Oracle Bulk Binds技术分析.pdf

    输出绑定使用`BULK COLLECT INTO`关键字,允许SQL引擎在返回结果给PL/SQL引擎前批量收集数据。这些数据可以是数量或复合值,如对象,被存储在INTO列表对应字段中。例如: ```sql SELECT ... BULK COLLECT INTO ...

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

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

    oracle dba quan gong lue

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

    oracle 迅速查询和更新大数据

    fetch c_bulk bulk collect into ref_bulk limit 250000; -- 执行批量插入操作 forall i in 1..ref_bulk.count insert into emp_table_his values ref_bulk(i); commit; exit when c_bulk%notfound; end loop...

    oracle删除数据方法。

    FETCH CUR_ROWID BULK COLLECT INTO V_ROWID_ARRAY LIMIT 10000; ``` - 使用 `BULK COLLECT` 将游标中的结果一次性读取到 `V_ROWID_ARRAY` 数组中,这里限制了每次最多读取10000条记录。 3. **批量删除数据**: ...

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

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

    oracle SQL 语句插入数据

    对于大量数据,可以使用PL/SQL的`BULK COLLECT INTO`语句提高性能: ```sql DECLARE TYPE EmpRecTyp IS TABLE OF Employees%ROWTYPE INDEX BY PLS_INTEGER; EmpTab EmpRecTyp; BEGIN SELECT * BULK COLLECT INTO...

Global site tag (gtag.js) - Google Analytics