update更新多行数据(oracle)

发布网友 发布时间:2024-10-24 17:23

我来回答

1个回答

热心网友 时间:3小时前

笔记总结了在工作中遇到过的几种update方法和各种方法适用的范围。



1. 单表更新方案:使用标准update语法即可,执行稳定且效率较高。格式为update table set (column1,column2,)=value1,value2,;,适用于单表更新。



2. 多表关联更新举例:例如,更新gkfq_rec表中所有slid与oa2_ftask表fi_inst相同的行,将blzt字段值更新为oa2_ftask表的ft_lstate。



方法描述、适用范围、运行效率:




传统方案:适用于一般情况下的单表更新,效率高且稳定。但当涉及多表时,效率较慢。
inline view更新法:适用于关联字段为主键的场景,速度较快。要求B表的主键字段必须在where条件中,并且是以=号来关联被更新表。若条件错误,可能报错。
merge更新法:适用于关联字段非主键的场景,速度较快。通过MERGE INTO语句操作,适用于连接条件不是主键的字段。
快速游标更新法:适用于复杂逻辑情况,效率很高。利用快速游标,支持复杂逻辑的查询语句,更新准确,无论数据多大更新效率依然很高。


具体实现方法如下:




传统方案:

update gkfq_rec aset blzt=(select b.ft_lstate from oa2_ftask b where a.slid=b.fi_inst)where exists(select 1 from oa2_ftask b where a.slid=b.fi_inst);


子查询返回多行值时,通过where exists条件逐行过滤,一一匹配实现set唯一值。



inline view更新法:

update (select a.blzt as blzt,b.ft_lstate as ft_lstatefrom gkfq_rec a,oa2_ftask b where a.slid=b.fi_inst)set blzt=ft_lstate;


要求B表的主键字段必须在where条件中,并且是以=号来关联被更新表,否则可能报错。



merge更新法:

merge into gkfq_rec ausing oa2_ftask bon (a.slid=b.fi_inst)when matched thenupdate set a.blzt=b.ft_lstate;


在alias2中select出来的数据,每一条都跟alias1进行比较,若匹配,就进行更新操作,不匹配,执行插入操作。



快速游标更新法:

beginfor aa in (select a.rowid as rowid,b.ft_lstate as ft_lstate from gkfq_rec a,oa2_ftask bwhere a.slid=b.fi_inst ) loopupdate gkfq_rec set blzt=aa.ft_lstatewhere rowid=aa.rowid;end loop;end;


配合oracle独有的内置ROWID物理字段,使用快速游标,不需要定义,直接把游标写到for循环中,快速定位并执行更新。





综上所述,针对不同的更新需求和场景,选择适合的方法可以提高更新效率和稳定性。在具体操作时,需根据实际数据和业务需求灵活选择。

声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com