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 bulk collect into 的几种用法的更多相关文章
- Oracle数据库之FORALL与BULK COLLECT语句
Oracle数据库之FORALL与BULK COLLECT语句 我们再来看一下PL/SQL块的执行过程:当PL/SQL运行时引擎处理一块代码时,它使用PL/SQL引擎来执行过程化的代码,而将SQL语句 ...
- PL/SQL — BULK COLLECT用法
BULK COLLECT 子句会批量检索结果,即一次性将结果集绑定到一个集合变量中,并从SQL引擎发送到PL/SQL引擎.通常可以在SELECT INTO.FETCH INTO以及RETURNING ...
- Oracle批量SQL之 BULK COLLECT 子句
BULK COLLECT 子句会批量检索结果,即一次性将结果集绑定到一个集合变量中,并从SQL引擎发送到PL/SQL引擎.通常可以在SELECT INTO.FETCH INTO以及RETURNING ...
- oracle学习之bulk collect用法
通过bulk collect减少loop处理的开销,使用Bulk Collect提高Oracle查询效率 Oracle8i中首次引入了Bulk Collect特性,该特性可以让我们在PL/SQL中能使 ...
- ORACLE PL/SQL开发--bulk collect的用法 .
刚刚在inthirties老大的博客里看到这篇文章,写的不错,正好自己最近在学习PL/SQL,转过来学习学习. ============================================ ...
- oracle中bulk collect into用法
通过bulk collect减少loop处理的开销 采用bulk collect可以将查询结果一次性地加载到collections中. 而不是通过cursor一条一条地处理. 可以在select in ...
- 【ORACLE】Bulk Processing with BULK COLLECT and FORALL
https://orablogspot.blogspot.com/2014/09/ https://blogs.oracle.com/oraclemagazine/bulk-processing-wi ...
- Oracle forall bulk collect批量数据更新
对于数据量较大的插入操作可采用此种方法操作,注意: limit减少内存占用,如果数据量较大一次性全部加载到内存中,对PGA来说压力太大,可采用limit的方法一次加载一定数量的数据,建议值通常为100 ...
- Oracle批量查询、删除、更新使用BULK COLLECT提高效率
BULK COLLECT(成批聚合类型)和数组集合type类型is table of 表%rowtype index by binary_integer用法笔记 例1: 批量查询项目资金账户号为 &q ...
随机推荐
- 使用 @Transactional 时常犯的N种错误
@Transactional是我们在用Spring时候几乎逃不掉的一个注解,该注解主要用来声明事务.它的实现原理是通过Spring AOP在注解修饰方法的前后织入事务管理的实现语句,所以开发者只需要通 ...
- centos7.6自动化安装mysql5.5
一.目的 简化安装mysql的安装过程,局限很大,仅支持centos7.6上安装mysql5.5.60,如果想在其他版本的操作系统安装mysql,请自行修改有关变量. 如果想了解mysql安装的具体过 ...
- ICCV2021 | Vision Transformer中相对位置编码的反思与改进
前言 在计算机视觉中,相对位置编码的有效性还没有得到很好的研究,甚至仍然存在争议,本文分析了相对位置编码中的几个关键因素,提出了一种新的针对2D图像的相对位置编码方法,称为图像RPE(IRPE). ...
- [cf1421E]Swedish Heroes
令$p_{i}$为最终$a_{i}$之前的系数($p_{i}\in \{-1,1\}$),则有$n+\sum_{i=1}^{n}[p_{i}=-1]\equiv 1(mod\ 3)$ 证明:对于两个满 ...
- 『学了就忘』Linux软件包管理 — 49、拓展:Linux中通过脚本安装程序
目录 1.脚本程序简介 2.Webmin安装 (1)简介 (2)安装 (3)使用 1.脚本程序简介 脚本程序包并不多见,所以在软件包分类中并没有把它列为一类.它更加类似于Windows下的程序安装,有 ...
- 【Tool】IntelliJ IDEA Ultimate2019.1 中文版 安装
IntelliJ IDEA Ultimate2019.1 2019-07-26 09:26:24 by冲冲 1. 下载 https://mp.weixin.qq.com/s/SdFQqGzMy-g ...
- Elasticsearch分布式搜索和数据分析引擎-ElasticStack(上)v7.14.0
Elasticsearch概述 **本人博客网站 **IT小神 www.itxiaoshen.com Elasticsearch官网地址 https://www.elastic.co/cn/elast ...
- Linux下Zabbix5.0 LTS + Grafana8.2.2图形可视化
Grafana是一款开源的可视化软件,可以搭配数据源实现一个数据的展示和分析:Grafana功能强大,有着丰富的插件,但Grafana默认没有zabbix作为数据源,需要手动给zabbix安装一个插件 ...
- C# 将Excel转为PDF时自定义表格纸张大小
通过后端程序将Excel表格转为PDF格式时,直接转换后的PDF效果可能出现表格页面过小或者过大,导致页面内容分布不均.要改善转换后的文档效果,只需在转换前自定义表格纸张大小,即可调整转换后的PDF页 ...
- Jmeter BlazeMeter实现web录制
1. BlazeMeter安装和注册 BlazeMeter是一款与Apache JMeter兼容的chrome插件,采用BlazeMeter可以方便的进行流量录制和脚本生成,作为接口测试脚本编写的 ...