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 批量效率的读取游标数据
详细介绍了使用 BULK COLLECT 进行批量操作 提高sql的执行效率 使用MERGE INTO USING 一条sql搞定 新增和修改 使用connect by 进行递归树查询
采用bulk collect可以将查询结果一次性地加载到collections中。...可以在select into,fetch into,returning into语句使用bulk collect。注意在使用bulk collect时,所有的into变量都必须是collections.
sal,ename BULK COLLECT INTO sal,ename BULK COLLECT INTO sal,ename BULK COLLECT INTO vsal,ename BULK COLLECT INTO sal,ename BULK COLLECT INTO sal,ename BULK COLLECT INTO sal,ename BULK COLLECT ...
bulk collect bulk collect bulk collect例子特殊应用
结合一个存储过程的实例,介绍了 bulk collect 的使用
在oracle使用中为了提高取数据效率,本文将详细介绍Oracle BULK COLLECT批量取数据,需要了解跟多的朋友可以参考下
记录 集合 BULK COLLECT FORALL 执行计划
bulk collect函数的使用,可以可以提高数据的访问效率
在一般的情况下,使用批量fetch的几率并不是很多,但是Oracle提供了这个功能我们最好能熟悉一下,说不定什么时候会用上它。 代码如下:declare cursor c1 is select * from t_depart; v_depart t_depart%...
BULK COLLECT(成批聚合类型)和数组集合type类型is table of 表%rowtype index by binary_integer用法笔记。 例1: 批量查询项目资金账户号为 “320001054663”的房屋账户信息并把它们打印出来 . DECLARE TYPE acct_...
Oracle 遍历游标的四种方式(for、fetch、while、bulk collect+forall) 2.问题分析 我们可以把游标想象成一张表,想要遍历游标,就要取到游标的每行数据,所以问题的关键就成了:如何取到行数据? 3.解决方案 ...
本篇文章小编为大家介绍一下,浅谈PL/SQL批处理语句:BULK COLLECT与FORALL对优化做出的贡献。有需要的朋友可以参考一下
bulk collect在 select ... into、fetch ... into、returning ... into中的应用。
oracle学习--动态数组测试,创建一个数组类型FORALL && BULK COLLECT