多行数据的批处理之bulk collect

简介: 在写pl/sql的时候,很多时候都会用比较经典的模式,定义一个游标cursor,然后循环从游标中取值进行处理。 类似下面的格式 declare cursor xxxx is xxxxx; begin loop cur in xxxxx loop xxxxx end loop; end; / 如果cursor中包含的数据太多的时候,可能会有性能问题,性能的考虑主要在于pl/sql引擎和sql引擎的切换,和编程中的上下文环境是类似的。

在写pl/sql的时候,很多时候都会用比较经典的模式,定义一个游标cursor,然后循环从游标中取值进行处理。
类似下面的格式
declare
cursor xxxx is xxxxx;
begin
loop cur in xxxxx loop
xxxxx
end loop;
end;
/

如果cursor中包含的数据太多的时候,可能会有性能问题,性能的考虑主要在于pl/sql引擎和sql引擎的切换,和编程中的上下文环境是类似的。
这个时候可以考虑采用bulk collect 的方式直接一次性读取数据岛缓存然后从缓存中进一步处理。
这种方式可以打个比方比较形象,比如 你带着一个新人去完成一个任务,可能一天他要问你100个问题,你是希望他每隔几分钟想到了就问你呢,还是让他自己把问题积累起来,专门设定一个时间来集中回答呢。可能你在忙另外一个事情,他问你一个问题,这个时候就会有上下文环境的切换,等你回答了之后,继续工作的时候,又一个问题来了,这时候又得进行一次切换。。。。
比方说我们设定一个表test,希望把test里面的数据选择性的插入到test_all中去
实现的原始Pl/sql如下:
declare
cursor test_cursors is select object_id,object_name from test;
begin
for test_cursor in test_cursors loop
dbms_output.put_line('object_id: '||test_cursor.object_id);
insert into test_all values(test_cursor.object_id,test_cursor.object_name);
end loop;
commit;
end;
/

如果采用bulk collect 方式,就会是如下的方式:
 declare
 type id_t is table of test.object_id%type;
 type name_t is table of test.object_name%type;
 object_id id_t;
 object_name name_t;
 cursor test_cursors is select object_id,object_name from test;
 begin
 open test_cursors;
 fetch test_cursors bulk collect into object_id,object_name;
 close test_cursors;
 for i in object_id.FIRST .. object_id.LAST loop
  dbms_output.put_line('object_id: '||object_id(i));
 insert into test_all values(object_id(i),object_name(i));
 end loop;
 commit;
 end;
 /


或者采用隐式游标的方式:
 declare
 type id_t is table of test.object_id%type;
 type name_t is table of test.object_name%type;
 object_id id_t;
 object_name name_t;
 begin
  select object_id,object_name bulk collect into object_id,object_name from test where rownum
 for i in object_id.FIRST .. object_id.LAST loop
  dbms_output.put_line('object_id: '||object_id(i));
 insert into test_all values(object_id(i),object_name(i));
 end loop;
 commit;
 end;
 /

目录
相关文章
|
前端开发 JavaScript 安全
小红书前端架构
小红书前端架构
|
Web App开发 安全 iOS开发
推荐一款超好用的“网盘高速下载”插件
推荐一款超好用的“网盘高速下载”插件
1503 0
|
存储 人工智能 供应链
光量子计算:计算速度的新突破
【9月更文挑战第17天】光量子计算利用光子的量子特性,突破传统计算瓶颈,展现强大信息处理能力。本文阐述了光量子计算原理,聚焦“九章三号”新进展:255光子高斯玻色取样,性能超越现有超级计算机亿亿倍。同时,展望其在优化问题解决、量子模拟、加密技术革新及人工智能加速上的应用前景,并讨论面临的挑战与未来技术发展的无限可能。
|
编译器 API C++
【感受C++的魅力】:用C++演奏歌曲《起风了》——含完整源码
【感受C++的魅力】:用C++演奏歌曲《起风了》——含完整源码
|
存储 编解码 API
【解码与渲染 异常情况】深入解析视频中绿色竖线现象(一)
【解码与渲染 异常情况】深入解析视频中绿色竖线现象
513 6
【解码与渲染 异常情况】深入解析视频中绿色竖线现象(一)
|
前端开发 物联网 异构计算
实时云渲染串流技术详解
云串流即使应用于云旅游、考古、数字孪生、云展厅等领域,通过将3D应用运行于云端,降低用户端配置需求。技术流程包括用户股指令、服务器执行、编码传输及前端播放,实现低延迟的实时云渲染。在弱网环境下,需只能调节画质确保流畅性。3D应用采用云推理,服务器需满足3D应用的硬件要求,尤其是GPU和GPU的性能,而前端主要负责解码播放,一般1080P视频能力即可。自行研发成本高,建议选择成熟商家点量云流。
585 0
实时云渲染串流技术详解
|
安全 搜索推荐 开发工具
“大厂”角力移动办公系统市场,钉钉和企微向左、WorkPlus向右
随着互联网行业的发展,移动办公软件市场在中国迅速崛起,2021年市场规模达264.2亿元,预计2023年将增长至330.1亿元。钉钉和企业微信成为市场领导者,凭借其内部管理与协同功能吸引大量用户。两者虽有相似之处,但各有特色,钉钉侧重内部管理,企业微信注重内外部连接。然而,SaaS模式的数据安全性和定制化能力成为挑战,部分企业转向私有化部署,如WorkPlus,它提供全私有化、个性化定制和系统集成解决方案。政策推动数字化发展,移动办公行业迎来机遇,不同厂商可根据客户需求提供SaaS或私有化部署服务。
348 1
|
存储 JavaScript 持续交付
云效问题之ACR内网地址拉不下来镜像如何解决
云效镜像是指存储在阿里云效服务中的容器镜像,它们可以用于持续集成和持续部署(CI/CD)流程中;本合集将介绍如何在云效平台上管理和使用镜像资源,以及常见的镜像问题和解决办法。
237 0
【面试问题】StampedLock 理解与使用
【1月更文挑战第27天】【面试问题】StampedLock 理解与使用
|
监控 容灾 测试技术
如何保障线上产品质量?
如何保障线上产品质量?
449 0