关于 oracle 批量更新的处理

[复制链接]
查看11 | 回复4 | 2013-2-25 14:51:24 | 显示全部楼层 |阅读模式
本帖最后由 oracle-admin 于 2014-1-22 16:17 编辑
我现在有一条多表关联的更新数据的sql语句,例如:
merge into tbl_ticketorder a
using (select ticketorder_id, newtourcode --, ticketno
from (select /*+ use_nl(s,t1) use_nl(t1,t2) use_nl(t2,t3) use_nl(t3,t4)*/

--t1.rowid as rid,

t1.ticketorder_id,

s.newtourcode,

t3.ticketno,

row_number() over(partition by t3.ticketno order by t1.ticketorder_id desc) as seq

from tmp_settleCenterPricing s,

tbl_ticketorder t1,

tbl_passenger t2,

tbl_orderprice
t3,

tbl_orderstatus t4

where t1.ticketorder_id = t2.orderid

and t2.passenger_id = t3.ORDERPRICE_ID

and t3.ticketno = t4.orderstatus_id

and s.fullticketno = t3.ticketno

and t1.status = 1

and t1.orderstate = 4)
where seq = 1) b
on (a.ticketorder_id = b.ticketorder_id)
when matched then
update set a.tourcode = b.newtourcode


QQ图片20140122160337.jpg (40.73 KB, 下载次数: 6)
下载附件
需要更新的数据的样例
2014-1-22 16:06 上传

现在有一个问题,比如更新999-2143276317的时候更新id为5082对应的值,但是再更新999-2143276319这个的时候,发现对应的id也是5082,由于是批量更新前一个没提交,下一个肯定无法更新了,结果就会报如下错误ORA-30926: unable to get a stable set of rows in the source tables
请问针对如上问题,该如何处理?是否只能通过游标循环,一条条的去更新并提交?不知是否有其他方法,请各位高手赐教!
要求是:在更新999-2143276317的时候,先更新一遍5082对应的值,提交;再接着更新999-2143276319对应的值,虽然还是5082对应的值,但是就把上一次更新的结果给再更新一遍,相当于覆盖了。后面的ticketno的值如果对应的还有相同的ticketorder_id的话,依次按照上面的方法去覆盖更新。


回复

使用道具 举报

千问 | 2013-2-25 14:51:24 | 显示全部楼层
这个错误貌似是是更新源表时,能关联上目标表两条或以上记录条数。楼主需要重新考虑业务逻辑是否正确。
回复

使用道具 举报

千问 | 2013-2-25 14:51:24 | 显示全部楼层
在USING的部分下功夫,使得结果集里面的b.ticketorder_id是唯一的。你用了PARTITION BY ticketno, 只能保证ticketno唯一。
回复

使用道具 举报

千问 | 2013-2-25 14:51:24 | 显示全部楼层
yangeoo 发表于 2014-1-22 17:47
这个错误貌似是是更新源表时,能关联上目标表两条或以上记录条数。楼主需要重新考虑业务逻辑是否正确。

谢谢,数据结构中,就是有可能是关联上目标表两条或者两条以上的记录,业务逻辑没有问题,因为后面的一条里面的内容都会包含前面一条的内容。所以才能使用覆盖的方式去逐条更新。
回复

使用道具 举报

千问 | 2013-2-25 14:51:24 | 显示全部楼层
newkid 发表于 2014-1-22 23:05
在USING的部分下功夫,使得结果集里面的b.ticketorder_id是唯一的。你用了PARTITION BY ticketno, 只能保证 ...

恩,我用partition by b.ticketno就是需要一个个的按照ticketno去更新,虽然他们可能对应的ticketorder_id一样,但是后更新的覆盖上一次更新的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行