用php更新oracle表,Oracle 之update

1、根据条件更新表里的某个字段值,如下:update test t set t.b_salary =case when t.b_id = 5 then 5000 when t.b_id = 6 the

1、根据条件更新表里的某个字段值,如下:

update test t set t.b_salary =

case when t.b_id = 5 then 5000

when t.b_id = 6 then 6000

when t.b_id = 7 then 7000

end

where t.b_id in (5,6,7)

说明: where条件部分一定要把记录限制为只需要更新的部分,否则其他部分会被更新为空。

2、2表关联update某个字段的

a)、一对一关联

update test1 t set t.a_salary =

( select a.b_salary from test a where a.b_id = t.a_id

)

where exists (select 1 from test a where a.b_id = t.a_id )

;

commit;

b)、一对多关联

(1)、目标表一个ID存在多条记录,源头是一个ID存一条记录,此种场景和一对一没有区别

update test1 t set t.a_salary =

( select a.b_salary from test a where a.b_id = t.a_id

)

where exists (select 1 from test a where a.b_id = t.a_id )

;

commit;

(2)、目标表一个ID一条记录,源头是一个ID存在多条记录

报错ora-01427 :单行子查询返回多条记录

本质上是目标表在源表根据关联ID去找的时候,一个ID找到了多条记录,返回给目标表的一条记录里目标值为多个。

若返回多个记录值都是一样的,返回任意一条都可以,则此时对返回值加上max,写法如下:

update test1 t set t.a_salary =

( select max(a.b_salary) from test a where a.b_id = t.a_id

)

where exists (select 1 from test a where a.b_id = t.a_id )

c)、多对多关联

报错ora-01427 :单行子查询返回多条记录

本质上是目标表在源表根据关联ID去找的时候,一个ID找到了多条记录,返回给目标表的一条记录里目标值为多个。

若返回多个记录值都是一样的,返回任意一条都可以,则此时对返回值加上max,写法如下:

update test1 t set t.a_salary =

( select max(a.b_salary) from test a where a.b_id = t.a_id

)

where exists (select 1 from test a where a.b_id = t.a_id )

;

commit;

说明: exists的作用,防止更新没有关联上的记录。若不加exists ,则目标表中无关记录会被置空。故这个exists一定要加上。

总结:

1、对于更新表内容,一定要把更新内容限制在只要更新的部分,where部分一定要有。

2、2表关联update的时候,目标表根据关联ID从源表去找记录的时候,,存在ID重复的记录和目标表没有关系,要注意源表存在ID重复的记录。

对于大表关联update,普通的写法,根本跑不动,百度了一下,根据rowid来更新,果然可以跑动。方法如下:

--t1 为源表

--t2 为要更新的目标表

declare

cursor cur is

select

a.t1_name, b.rowid row_id

from t1 a, t2 b

where a.t1_id = b.t2_id

order by b.rowid;

v_counter number;

begin

v_counter := 0;

for row in cur loop

update t2 t

set t.t2_name = row.t1_name

where rowid = row.row_id;

v_counter := v_counter + 1;

if (v_counter >= 1000) then

commit;

v_counter := 0;

end if;

end loop;

commit;

end;

相关阅读:

Oracle update执行计划原理解析与优化

Oracle 中 update nowait 的使用方法

Oracle存储过程使用实例之update的使用

Oracle update关联表的思路总结

Oracle for update of 和 for update区别

logo.gif

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值