Oracle实战优化:INSERT ALL关键字的应用 Linux中MySQL数据库的使用②-----数据的基本操作 理论+实验——MySQL备份与恢复 MySQL常用数据库函数 MySQL 备份与恢复(完全备份恢复--增量备份恢复+案例演示) MySQL之基础总结部分 Oracle实战优化:递归+分析函数+OLAP函数的应用 Linux中MySQL数据库的使用③-----编码和基本数据类型 理论+实验:MySQL备份与恢复(完整备份、增量备份) “数”聚永川 “智”引未来——永川区大数据智能化产业发展强劲 从一款防疫App感受新加坡大数据智能化气息 “数”聚永川“智”引未来——永川区大数据智能化产业发展强劲 从连接量变到数据质变 物联网将二次爆发 重磅发布!猎芯半导体首创全球最小支持5G物联网的多模多频射频PA芯片 从精准授信到助企惠民,江苏银行物联网金融派上大用场 Python Selenium UI自动化_WebDriver元素_8大定位方式+总结(持续更新完善) Python中的继承、抽象基类和接口 Datawhale学习笔记【阿里云天池 金融风控-贷款违约预测】task1 赛题理解 Pytorch - torchvision计算机视觉工具库 linux 重点笔记 Ubuntu18.04安装ROS Melodic(一路到站型) 小甲鱼笔记:数据结构——线性表(一)线性表的顺序存储结构,线性表顺序存储结构的增,删,插入元素操作 实战比特币脚本编程(1) JAVA WEB DAY 01_Tomcat & Servlet Java基础算法之堆排序(Heap Sort) synchronized批量重偏向与批量撤销 终于等到了!阿里P8历时九个月整理,Java面试宝典,核心知识点笔记在此 “数字心脏”动态解析消费密码,国家级消费市场大数据联合实验室在上海先行先试 全世界运行着大约230亿台物联网设备,安全问题如何解? 物联网产业园&thinkplus解决方案中心国学讲座如期而至 都是程序员,凭什么他能站在鄙视链的顶端? 猛男必看!去小红书做程序员是种什么体验 drozer提示[Errno 2] No such file or directory 【STM32】NB-iOT BC35-G模块 AT指令应用设计指导(附代码) 【北京迅为】i.MX6ULL终结者编译LED汇编程序 Linux系统读写网卡PHY寄存器工具 洛谷:P1226 【模板】快速幂||取余运算(分治,数学) 【2020顶会KDD】AutoST:面向时空预测的高效神经网络学习模型 C/C++实现并查集disjoint_set的模板(带路径压缩优化) 实现一个百万级推送服务,除了它,还有谁 “健康守护者”——STM32标准库和HAL库的比较 程序员被公司辞退12天后,前领导要求回公司讲清代码,结果懵了 RTTR实现C++反射(1)集成rttr库 lotus node 远程运行 CCF历年4,5题收录 N卡 RTX3070/RTX3080/RTX3090挖矿算力推测 最高算力86MH 理论+实验:MySQL索引、事物与存储引擎 PostgreSQL JOIN 多表查询 TP框架实现Excel批量导入数据库数据 MySQL中的列转行
您的位置:首页 >前端 >

Oracle实战优化:INSERT ALL关键字的应用

原创文章,转载请注明出处,谢谢合作。 https://blog.csdn.net/DarianMograine/article/details/108562035

日前,笔者在优化数据库PROCEDURE的过程中遇到这样一个场景:

DECLAREl_header_id NUMBER;CURSOR cur_headers ISSELECT col1,col2FROM table_aWHERE1 = 1ANDxxxx = xxxx;CURSOR cur_lines(cp_col1 VARCHAR2,cp_col2 VARCHAR2) ISSELECT b.*FROM table_bWHEREcol1 = cp_col1ANDcol2 = cp_col2;BEGINFOR rec IN cur_headers LOOPl_header_id := xxx_headers_s.nextval;INSERT INTO header_insert(header_id, col1, col2)VALUES(l_header_id, rec.col1, rec.col2);FOR line IN cur_lines(rec.col1, rec.col2) LOOPINSERT INTO line_insert(header_id, line_id, col3, col4, col5, col6)VALUES(l_header_id,xxx_lines_s.nextval,line.col3,line.col4,line.col5,line.col6);END LOOP;END LOOP;END;

这是一个非常典型的循环遍历以插入数据到数据库表的过程, 在table_a和table_b的数据量暴增时程序的运行时间会急剧上升, 而针对这个问题,我们可以通过INSERT ALL来解决。

笔者在这里希望给大家一个建议,如果遇到这样的场景,请按下面的方式来写这段SQL,一段解决所有问题,让你的代码变得更优雅。

针对上面的代码块,我们可以用下面的代码来代替,利用分析函数ROW_NUMBER来控制对头表数据的插入:

DECLAREFUNCTION get_hdr_seq RETURN NUMBER ISRETURN xxx_headers_s.nextval;END get_hdr_seq;FUNCTION get_line_seq RETURN NUMBER ISRETURN xxx_lines_s.nextval;END get_line_seq;BEGININSERT ALL --WHEN rn = 1 THEN --当是每个HEADER_ID的第一行时插入头表一条数据INTO header_insert(header_id, col1, col2)VALUES(header_id, col1, col2) --WHEN 1 = 1 THEN --INTO line_insert(header_id, line_id, col3, col4, col5, col6)VALUES(header_id, line_id, col3, col4, col5, col6)SELECT h.header_id,h.col1,h.col2,l.line_id,l.col3,l.col4,l.col5,l.col6,row_number() over(PARTITION BY h.col1, h.col2 ORDER BY l.col3, l.col4) rnFROM (SELECT get_hdr_seq header_id,col1,col2FROM table_a hWHERExxxx = xxxx) h,(SELECT get_line_seq line_id,col1,col2,col3,col4,col5,col6FROM table_b l) lWHEREh.col1 = l.col1ANDh.col2 = l.col2;END;

以上,希望对大家有帮助,感兴趣的同学可以一试。

原创文章,转载请注明出处,谢谢合作。 https://blog.csdn.net/DarianMograine/article/details/108562035

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。