百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

三个经典实例助你掌握Oracle数据库bulk collect批量绑定

yuyutoo 2024-10-28 20:22 2 浏览 0 评论

概述

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


语法

FETCH BULK COLLECT <cursor_name> BULK COLLECT INTO <collection_name>
LIMIT <numeric_expression>;
or
FETCH BULK COLLECT <cursor_name> BULK COLLECT INTO <array_name>
LIMIT <numeric_expression>;

Oracle8i中首次引入了Bulk Collect特性,该特性可以让我们在PL/SQL中能使用批查询,批查询在某些情况下能显著提高查询效率。

采用bulk collect可以将查询结果一次性地加载到collections中。

而不是通过cursor一条一条地处理。

可以在select into,fetch into,returning into语句使用bulk collect。

注意在使用bulk collect时,所有的into变量都必须是collections


实例:BULK COLLECT将得到的结果集绑定到记录变量中

DECLARE
 TYPE emp_rec_type IS RECORD --声明记录类型
 ( 
 empno emp.empno%TYPE 
 ,ename emp.ename%TYPE
 ,hiredate emp.hiredate%TYPE 
); 
 TYPE nested_emp_type IS TABLE OF emp_rec_type; --声明记录类型变量
 emp_tab nested_emp_type;
 
BEGIN
 SELECT empno, ename, hiredate BULK COLLECT INTO emp_tab --使用BULK COLLECT 将所得的结果集一次性绑定到记录变量emp_tab中
 FROM emp;
 
 FOR i IN emp_tab.FIRST .. emp_tab.LAST 
 LOOP
 DBMS_OUTPUT.put_line('Current record is '||emp_tab(i).empno||chr(9)||emp_tab(i).ename||chr(9)||emp_tab(i).hiredate); 
 END LOOP;
END; 
/

实验:使用LIMIT限制FETCH数据量

在使用BULK COLLECT 子句时,对于集合类型,如嵌套表,联合数组等会自动对其进行初始化以及扩展(如下示例)。因此如果使用BULK

COLLECT子句操作集合,则无需对集合进行初始化以及扩展。由于BULK COLLECT的批量特性,如果数据量较大,而集合在此时又自动扩展,为避免过大的数据集造成性能下降,因此使用limit子句来限制一次提取的数据量。limit子句只允许出现在fetch操作语句的批量中。

DECLARE 
 CURSOR emp_cur IS SELECT empno, ename, hiredate FROM emp;
 TYPE emp_rec_type IS RECORD 
 ( 
 empno emp.empno%TYPE 
 ,ename emp.ename%TYPE
 ,hiredate emp.hiredate%TYPE
 ); 
 TYPE nested_emp_type IS TABLE OF emp_rec_type; -->定义了基于记录的嵌套表 
 
 emp_tab nested_emp_type; -->定义集合变量,此时未初始化 
 v_limit PLS_INTEGER := 5; -->定义了一个变量来作为limit的值 
 v_counter PLS_INTEGER := 0; 
 
BEGIN 
 OPEN emp_cur; 
LOOP 
 FETCH emp_cur BULK COLLECT INTO emp_tab -->fetch时使用了BULK COLLECT子句 
 LIMIT v_limit; -->使用limit子句限制提取数据量 
 EXIT WHEN emp_tab.COUNT = 0; -->注意此时游标退出使用了emp_tab.COUNT,而不是emp_cur%notfound 
 v_counter := v_counter + 1; -->记录使用LIMIT之后fetch的次数 
 FOR i IN emp_tab.FIRST .. emp_tab.LAST 
 LOOP 
 DBMS_OUTPUT.put_line( 'Current record is '||emp_tab(i).empno||CHR(9)||emp_tab(i).ename||CHR(9)||emp_tab(i).hiredate); 
 END LOOP; 
END LOOP; 
CLOSE emp_cur; 
DBMS_OUTPUT.put_line( 'The v_counter is ' || v_counter ); 
END;
/

实验:RETURNING 子句的批量绑定

BULK COLLECT除了与SELECT,FETCH进行批量绑定之外,还可以与INSERT,DELETE,UPDATE语句结合使用。当与这几个DML语句结合时,我们 需要使用RETURNING子句来实现批量绑定。

DECLARE 
 TYPE emp_rec_type IS RECORD 
 ( 
 empno emp.empno%TYPE 
 ,ename emp.ename%TYPE 
 ,hiredate emp.hiredate%TYPE 
 ); 
 
 TYPE nested_emp_type IS TABLE OF emp_rec_type; 
 
 emp_tab nested_emp_type; 
-- v_limit PLS_INTEGER := 3; 
-- v_counter PLS_INTEGER := 0; 
BEGIN 
 DELETE FROM emp WHERE deptno = 20 
 RETURNING empno, ename, hiredate -->使用returning 返回这几个列 
 BULK COLLECT INTO emp_tab; -->将前面返回的列的数据批量插入到集合变量 
 
 DBMS_OUTPUT.put_line( 'Deleted ' || SQL%ROWCOUNT || ' rows.' ); 
 COMMIT; 
 
 IF emp_tab.COUNT > 0 THEN -->当集合变量不为空时,输出所有被删除的元素 
 FOR i IN emp_tab.FIRST .. emp_tab.LAST 
 LOOP 
 DBMS_OUTPUT. 
 put_line( 
 'Current record ' 
 || emp_tab( i ).empno 
 || CHR( 9 ) 
 || emp_tab( i ).ename 
 || CHR( 9 ) 
 || emp_tab( i ).hiredate 
 || ' has been deleted' ); 
 END LOOP; 
 END IF; 
END; 
/

篇幅有限,关于bulk collect批量绑定方面的内容就介绍到这了,大家可以试着对存储过程中loop循环中的DML语句做适当改写,看是不是效率上有一定提升。实际上最好的应该是FORALL与BULK COLLECT结合使用,可以极大的提高执行效率。

后面会分享更多DBA方面内容,感兴趣的朋友可以关注下!

相关推荐

史上最全的浏览器兼容性问题和解决方案

微信ID:WEB_wysj(点击关注)◎◎◎◎◎◎◎◎◎一┳═┻︻▄(页底留言开放,欢迎来吐槽)●●●...

平面设计基础知识_平面设计基础知识实验收获与总结
平面设计基础知识_平面设计基础知识实验收获与总结

CSS构造颜色,背景与图像1.使用span更好的控制文本中局部区域的文本:文本;2.使用display属性提供区块转变:display:inline(是内联的...

2025-02-21 16:01 yuyutoo

写作排版简单三步就行-工具篇_作文排版模板

和我们工作中日常word排版内部交流不同,这篇教程介绍的写作排版主要是用于“微信公众号、头条号”网络展示。写作展现的是我的思考,排版是让写作在网格上更好地展现。在写作上花费时间是有累积复利优势的,在排...

写一个2048的游戏_2048小游戏功能实现

1.创建HTML文件1.打开一个文本编辑器,例如Notepad++、SublimeText、VisualStudioCode等。2.将以下HTML代码复制并粘贴到文本编辑器中:html...

今天你穿“短袖”了吗?青岛最高23℃!接下来几天气温更刺激……

  最近的天气暖和得让很多小伙伴们喊“热”!!!  昨天的气温到底升得有多高呢?你家有没有榜上有名?...

CSS不规则卡片,纯CSS制作优惠券样式,CSS实现锯齿样式

之前也有写过CSS优惠券样式《CSS3径向渐变实现优惠券波浪造型》,这次再来温习一遍,并且将更为详细的讲解,从布局到具体样式说明,最后定义CSS变量,自定义主题颜色。布局...

柠檬科技肖勃飞:大数据风控助力信用社会建设

...

你的自我界限够强大吗?_你的自我界限够强大吗英文

我的结果:A、该设立新的界限...

行内元素与块级元素,以及区别_行内元素和块级元素有什么区别?

行内元素与块级元素首先,CSS规范规定,每个元素都有display属性,确定该元素的类型,每个元素都有默认的display值,分别为块级(block)、行内(inline)。块级元素:(以下列举比较常...

让“成都速度”跑得潇潇洒洒,地上地下共享轨交繁华
让“成都速度”跑得潇潇洒洒,地上地下共享轨交繁华

去年的两会期间,习近平总书记在参加人大会议四川代表团审议时,对治蜀兴川提出了明确要求,指明了前行方向,并带来了“祝四川人民的生活越来越安逸”的美好祝福。又是一年...

2025-02-21 16:00 yuyutoo

今年国家综合性消防救援队伍计划招录消防员15000名

记者24日从应急管理部获悉,国家综合性消防救援队伍2023年消防员招录工作已正式启动。今年共计划招录消防员15000名,其中高校应届毕业生5000名、退役士兵5000名、社会青年5000名。本次招录的...

一起盘点最新 Chrome v133 的5大主流特性 ?

1.CSS的高级attr()方法CSSattr()函数是CSSLevel5中用于检索DOM元素的属性值并将其用于CSS属性值,类似于var()函数替换自定义属性值的方式。...

竞走团体世锦赛5月太仓举行 世界冠军杨家玉担任形象大使

style="text-align:center;"data-mce-style="text-align:...

学物理能做什么?_学物理能做什么 卢昌海

作者:曹则贤中国科学院物理研究所原标题:《物理学:ASourceofPowerforMan》在2006年中央电视台《对话》栏目的某期节目中,主持人问过我一个的问题:“学物理的人,如果日后不...

你不知道的关于这只眯眼兔的6个小秘密
你不知道的关于这只眯眼兔的6个小秘密

在你们忙着给熊本君做表情包的时候,要知道,最先在网络上引起轰动的可是这只脸上只有两条缝的兔子——兔斯基。今年,它更是迎来了自己的10岁生日。①关于德艺双馨“老艺...

2025-02-21 16:00 yuyutoo

取消回复欢迎 发表评论: