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 bulk collect into 的几种用法的更多相关文章

  1. Oracle数据库之FORALL与BULK COLLECT语句

    Oracle数据库之FORALL与BULK COLLECT语句 我们再来看一下PL/SQL块的执行过程:当PL/SQL运行时引擎处理一块代码时,它使用PL/SQL引擎来执行过程化的代码,而将SQL语句 ...

  2. PL/SQL — BULK COLLECT用法

    BULK COLLECT 子句会批量检索结果,即一次性将结果集绑定到一个集合变量中,并从SQL引擎发送到PL/SQL引擎.通常可以在SELECT INTO.FETCH INTO以及RETURNING ...

  3. Oracle批量SQL之 BULK COLLECT 子句

    BULK COLLECT 子句会批量检索结果,即一次性将结果集绑定到一个集合变量中,并从SQL引擎发送到PL/SQL引擎.通常可以在SELECT INTO.FETCH INTO以及RETURNING ...

  4. oracle学习之bulk collect用法

    通过bulk collect减少loop处理的开销,使用Bulk Collect提高Oracle查询效率 Oracle8i中首次引入了Bulk Collect特性,该特性可以让我们在PL/SQL中能使 ...

  5. ORACLE PL/SQL开发--bulk collect的用法 .

    刚刚在inthirties老大的博客里看到这篇文章,写的不错,正好自己最近在学习PL/SQL,转过来学习学习. ============================================ ...

  6. oracle中bulk collect into用法

    通过bulk collect减少loop处理的开销 采用bulk collect可以将查询结果一次性地加载到collections中. 而不是通过cursor一条一条地处理. 可以在select in ...

  7. 【ORACLE】Bulk Processing with BULK COLLECT and FORALL

    https://orablogspot.blogspot.com/2014/09/ https://blogs.oracle.com/oraclemagazine/bulk-processing-wi ...

  8. Oracle forall bulk collect批量数据更新

    对于数据量较大的插入操作可采用此种方法操作,注意: limit减少内存占用,如果数据量较大一次性全部加载到内存中,对PGA来说压力太大,可采用limit的方法一次加载一定数量的数据,建议值通常为100 ...

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

    BULK COLLECT(成批聚合类型)和数组集合type类型is table of 表%rowtype index by binary_integer用法笔记 例1: 批量查询项目资金账户号为 &q ...

随机推荐

  1. Windows 常用配置

    安装IIS服务器 在服务器管理器中,选择"角色"添加角色 进入添加角色向导,在安装界面,选择服务器角色为:" Web服务器(IIS) " 角色服务勾选:应用程序 ...

  2. {% csrf_token %} 原理和作用 (踩坑必看)

    本博客已暂停更新,请转自新博客 https://www.whbwiki.com/320.html 继续阅读 简介 在django中我们需要在templates的form中加入{%csrf_token% ...

  3. 深入剖析 RocketMQ 源码 - 消息存储模块

    一.简介 RocketMQ 是阿里巴巴开源的分布式消息中间件,它借鉴了 Kafka 实现,支持消息订阅与发布.顺序消息.事务消息.定时消息.消息回溯.死信队列等功能.RocketMQ 架构上主要分为四 ...

  4. LeetCode 114. 二叉树展开为链表 C++

    /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode ...

  5. Pytest使用pytest-html和allure生成测试报告

    Pytest-html 1.安装命令pip3 install pytest-html,如下图: 执⾏后,会在当前⽬录下⽣成 ⼀个report.html的⽂件,打开后会展示详细的测试报告,执行该命令py ...

  6. 日志框架-logtube

    Logtube 是什么 logtube 框架是基于 slf4j的一个日志框架封装, 源码地址: https://github.com/logtube 基于 SLF4J框架, 扩展了日志输出格式 (兼容 ...

  7. Part 29 AngularJS intellisense in visual studio

    In the previous videos if you have noticed as we were typing the angular code in Script.js file we w ...

  8. 13-Semi-supervised Learning

    半监督学习(semi-supervised learning) 1.introduction 2.Semi-supervised Learning for Generative Model 3.Low ...

  9. 让Qt给你报时,为你读诗词 之 Qt5 TTS

    对,Qt没有食言,9月底如期发布了6.2 LTS.嗯,昨天是9月30日,是月底没错,准时没毛病.博客地址如下 https://www.qt.io/blog/qt-6.2-lts-release 对于老 ...

  10. [zoj3990]Tree Equation

    记$dep(T)$为树$T$的深度(根节点深度为0),则有$\begin{cases}dep(A+B)=\max(dep(A),dep(B))\\dep(A\cdot B)=dep(A)+dep(B) ...