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. Linux 权限控制

    权限管理概述 为什么要进行权限管理? 因为在生产服务器上,如果要让普通用户登录,就要给他分配合理的权限,在服务器上需要为用户严格定义权限等级,否则如果所有人都是roσt权限,权限过高容易导致岀现误操作 ...

  2. Vuex状态管理——任意组件间通信

    核心概念 在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信. 每一个 Vuex 应用的 ...

  3. 03 | 变量的解构赋值 | es6

    变量的解构赋值 数组的解构赋值 基本用法 ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 以前,为变量赋值,只能直接指定值. let a ...

  4. Mysql - 如何存储 10位、13位的 unix 时间戳?

    背景 前面有讲过存日期时间可以用  datetime.timestamp 类型:https://www.cnblogs.com/poloyy/p/15546735.html 格式是: YYYY-MM- ...

  5. 编解码再进化:Ali266 与下一代视频技术

    过去的一年见证了人类百年不遇的大事记,也见证了多种视频应用的厚积薄发.而因此所带来的视频数据量的爆发式增长更加加剧了对高效编解码这样的底层硬核技术的急迫需求. 新视频编解码标准 VVC 定稿不久之后, ...

  6. 体验用yarp连接websocket

    前段时间一看yarp的仓库,wow,终于发布1.0版本了..net也升级到6版本了,之前一直只是用yarp做HTTP转发,今天刚好试试websocket 话不多说,直接开搞 配置集群 首先先配置集群信 ...

  7. Docker极简入门:使用Docker运行Java程序

    运行简单的Java程序 先在当前目录创建App.java文件 public class App{ public static void main(String[] args){ String os = ...

  8. 关于uni-app导航栏中 中间大图标的设置

    在uni-app的开发过程中,想要将位于中间的图标设置更大,通过一般的更改导航栏图标大小方式实现不了.经过查看官方文档可以发现,我们可以通过midbutton来设置中间tabbar的样式. 但前提是, ...

  9. 【程序员翻身计划】Java高性能编程第一章-Java多线程概述

    目标 重点: 线程安全的概念 线程通信的方式与应用 reactor线程模型 线程数量的优化 jdk常用命令 Netty框架的作用 难点 java运行的原理 同步关键字的原理 AQS的抽象 JUC的源码 ...

  10. 基于Ubuntu 18.04.5 LTS 部署Ceph集群测试及Ceph RDB的使用。

    1.ceph简介 Ceph在一个统一的系统中独特地提供对象.块和文件存储 1.1 ceph官网架构图 1.2 架构解释   CEPH 对象存储 CEPH 块设备 CEPH 文件系统 RESTful 接 ...