update更新多行数据(oracle)

嘿,咱们聊聊Oracle数据库里更新多行数据的那些事儿。
首先得说说,这事儿在2 02 2 年某个城市的一个项目中,我们遇到了好几次,得解决啊。
咱们先来瞧瞧传统方案,这玩意儿虽然速度可能慢了点,但适用性挺广的。
比如,我们得更新gkfq_rec表里的blzt字段,那得用子查询跟主表来对上号,这样子查询就能返回多行值了。
咱们得用whereexists来逐行过滤,保证set的唯一性。
当时写了个SQL,挺复杂的,得这样:
sql update gkfq_rec 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);
这招挺管用的,但有时候速度可能不那么快。

接下来,咱们得聊聊inline view更新法。
这招在更新临时视图的时候挺有用的,得确保B表的主键字段在where条件里,用等号来关联被更新表。
得小心那个“ORA-01 7 7 9 ”的错误,那是说不能修改与非键值保存表对应的列。
B表主键如果是多列组合,也得注意。
咱们写了个SQL,大致这样:
sql update (select a.blzt as blzt, a.slzt as slzt, b.ft_lstate as ft_lstate from gkfq_reca, oa2 _ftaskb where a.slid = b.fi_inst) set blzt = ft_lstate;
这招挺快的,但有时候也会出错。

然后是merge更新法。
这招适用于连接条件不是主键的字段。
在merge语句里,咱们比较alias2 中的数据与alias1 ,匹配的就更新,不匹配的就插入。
merge语句不返回影响行数,最多只能两表关联。
咱们写了个SQL,大概这样:
sql merge into gkfq_reca using oa2 _ftaskb on (a.slid = b.fi_inst) when matched then update set a.blzt = b.ft_lstate;
这招挺快的,但得注意只适用于两表。

最后得说说快速游标更新法。
这招在处理复杂逻辑的时候效率很高,配合ROWID物理字段用。
快速定位并执行更新操作,不管数据多大,更新效率都挺高。
执行后不返回影响行数。
咱们写了个SQL,大致这样:
sql begin for a in (select a.rowid as rowid, b.ft_lstate as ft_lstate from gkfq_reca, oa2 _ftaskb where a.slid = b.fi_inst) loop update gkfq_rec set blzt = a.ft_lstate where rowid = a.rowid; end loop; end;
总结一下,根据不同的需求,咱们得选择合适的更新方法,这样才能提高效率和准确性。
当时我也懵,后来才反应过来,可能我偏激了点,但这些都是实际操作中用到的。

怎么实现oracle数据库某个表中某一列中日期的批量修改,而不修改时间。

Oracle批量改日期只变日期部分,用UPDATE test SET begintime = trunc(sysdate);
时间截断,用trunc(sysdate),清零时间。

改完记得commit;提交。

这法子高效,大量数据也行。
你自己掂量。

oracle问题:alter update modify 的区别是什么

记得有一次,我帮一个同事优化数据库表结构,他用的命令是“update”,我一看,不对啊,这应该是修改数据的命令,不是改表结构的。
我说:“兄弟,你这是想更新数据呢还是想改表结构?”他一脸懵,说:“我这是想改表结构啊。
”我笑了笑,说:“那应该是用‘alter’命令才对。
”他恍然大悟,赶紧改了过来。

等等,还有个事,我突然想到,之前有个项目,我们用“modify”去调整字段长度,结果发现,其实这个命令是作为“alter”命令的一部分来使用的,不能单独执行。
这让我想到,有时候,命令的用法并不是表面上看起来的那么简单,得深入理解其背后的逻辑和用法。