问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何实现oracle一次更新多行记录

发布网友 发布时间:2022-04-08 09:30

我来回答

3个回答

懂视网 时间:2022-04-08 13:51

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

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

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

create table gkfq_rec (

slid char(12) parimary key,

blzt varchar2(50),

wjbt varchar2(100) not null,

........

);

create table oa2_ftask (

fi_inst char(12) parimary key,

fi_state int not null,

ft_lstate int not null,

...

);

 

 方法描述

 适用范围

 运行效率

 传统方案  一般情况适用  单表更新效率高且稳定,多表时效率较慢
 inline view更新法  关联字段为主键  速度较快
 merge更新法  关联字段非主键,适用于两表关联  非主键关联表更新,速度较快
 快速游标更新法  逻辑较复杂的情况  复杂逻辑时效率很高

 

(1)传统方案(速度可能最慢)
update gkfq_rec a 
set 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唯一值

(2)inline view更新法(关联主键字段,速度较快)
方案:更新一个临时建立的视图。要求B表的主键字段必须在where条件中,并且是以=号来关联被更新表,否则可能报错:ORA-01779:无法修改与非键值保存表对应的列。当B表主键字段为多列组合时,也有可能出现这一报错。update (select a.blzt as blzt,b.ft_lstate as ft_lstate
from gkfq_rec a,oa2_ftask b where a.slid=b.fi_inst) 
set blzt=ft_lstate
;

(3)merge更新法(关联字段非主键时,速度较快)
语法:
MERGE INTO table_name alias 1
USING (table|view|sub_query) alias 2
ON (join condition)
WHEN MATCHED THEN
UPDATE 
SET col1=col_val1,
    col2=col_val2
WHEN NOT MATCHED THEN
INSERT (column_list) VALUES (column_values);

方案:在alias2中select出来的数据,每一条都跟alias1进行ON (join condition)比较,若匹配,就进行更新操作,不匹配,执行插入操作。merge不会返回影响行数,且最多只能两表关联,适用于连接条件不是主键的字段。
merge into gkfq_rec a
using oa2_ftask b
on (a.slid=b.fi_inst)
when matched then
update set a.blzt=b.ft_lstate;

(4)快速游标更新法(复杂逻辑时,效率很高)
语法:
begin
for cr in (查询语句) loop  --循环
update table_name set ...   --更新语句(根据查询出来的结果集合)
end loop;  --结束循环
end;

方案:配合oracle独有的内置ROWID物理字段,使用快速游标,不需要定义,直接把游标写到for循环中,快速定位并执行更新。它可以支持复杂逻辑的查询语句,更新准确,无论数据多大更新效率依然很高。但执行后不返回影响行数。
begin
for aa in (select a.rowid as rowid,b.ft_lstate as ft_lstate from gkfq_rec a,oa2_ftask b
where a.slid=b.fi_inst ) loop
update gkfq_rec set blzt=aa.ft_lstate
where rowid=aa.rowid;
end loop;
end;

update更新多行数据(oracle)

标签:

热心网友 时间:2022-04-08 10:59

在网上看到的,记录下,实现多行多列更新
update table1 r
set (r.city,r.COUNTY,r.CELL_NAME,r.CELL_UK)
=
( select
m.company_name,m.COUNTY_NAME,m.cell_name,m.cell_uk
FROM table2 m where m.flow_id = r.flow_id
)
where exists (select 1 from table2 m where m.flow_id = r.flow_id )

创建联合主键如下:
ALTER TABLE ADD CONSTRAINTS '约束名' PRIMARY KEY (COLUMN,COLUMN,...);

热心网友 时间:2022-04-08 12:17

根据where条件判断啊。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
U盘更新专用需要电脑打开怎么让我的U盘和电脑文件夹同步更新啊_百度知 ... 为什么我的硬盘一打开就弹出对话框说选择打开方式. 倒霉的是右键也打... 磁盘右键是打开方式怎么办 我双机盘符总是打开 打开方式 让我选择,右健第一项是打开.不知道是中了... 罗技Lightspeed怎么用? 罗技无线鼠标怎么样?怎么连接电脑使用? 为什么不建议去融资公司上班 融资担保公司一般账务处理及所涉及的会计科目有哪些 月经期间可以游泳吗 经期能不能游泳 oracle怎么用函数求一个存储过程的输入参数(是一个以,为分隔的字符串... 如何让做好热词的关键词优化 请问一下的oracle字符函数lpad怎么解释? 哪位有没有用过好用的优化工具,我在苏州 苏州网站优化影响因素 在沈阳那些地方能肯定卖到小米最大屏手机能立刻多正确告诉几个地点好吗给大家满意回答? 苏州网站优化下面这些词要多少钱! 给个准确的数字! 我在吉林,如果去沈阳手机屏幕的天气预报会更改到沈阳吗 沈阳那些地方能肯定买到2手大屏三星华为手机处小北还那些地方能肯定买到求求好心大家能立刻告诉正确谢 怎样做热门关键字排名优化? 苏州SEO优化! 苹果x面容总成多少钱? 苹果X的显示屏和面容坏了要多少钱来维修 苏州市网站推广优化,苏州市网站推广优化公司哪家好 换手机液晶屏幕多少钱? 旧手机显示屏摔坏了,有修的必要吗? 三星手机换个屏幕大概需要多少钱呢? 沈阳小北手机市场小米2s屏幕更换多少钱 手机外屏就是玻璃碎了换要多少钱 iphone手机屏碎了在沈阳要到哪里去修?多少钱? 在清华大学开学典礼上一段开学演讲走红,这段演讲的主题是什么? 清华大学励志名言 夏普空调遥控器表示切换按键是什么意思 求问下图夏普空调遥控器的模式使用图标 怎样下载扣扣音乐 我想下载QQ音乐 下载在QQ音乐里面然后为什么没有出现在文件管理里? QQ音乐该如何下载网络歌曲 下载了个QQ音乐 想把本地的歌曲弄到QQ音乐里的怎么弄的啊? 下载了一个QQ音乐,然后电脑自动下载了很多东西,.还卸载不了 编辑图片要用什么软件 求好用的编图软件 编辑图片用什么软件好??? 8g 256G适合编图软件吗 用什么软件制作棒针和钩针的图案的图解? 图片编辑用什么软件好? dota2小8怎么没直播了 xiao8直播谈DOTA2职业圈 这是得罪多少人的节奏 dota2怎么没有直播了 编辑照片用什么软件?