oracle视图不能更新数据,Oracle内联视图更新遇到的问题

遇到一个批量更新的需求,我打算用内联视图更新+where in list的技巧处理。

UPDATE (

SELECT /*+ BYPASS_UJVC */ *

FROM mvbox_space.music_original t1

INNER JOIN (

SELECT REGEXP_SUBSTR(value_str, '[^,]+', 1, 1) AS p1, REGEXP_SUBSTR(value_str, '[^,]+', 1, 2) AS p2

FROM (

SELECT SUBSTR(inlist, INSTR(inlist, ';', 1, LEVEL) + 1, INSTR(inlist, ';', 1, LEVEL + 1) - INSTR(inlist, ';', 1, LEVEL) - 1) AS value_str, level AS l

FROM (

SELECT ';' || '20077,1;20078,2' || ';' AS inlist

FROM DUAL

)

CONNECT BY LEVEL <= LENGTH('20077,1;20078,2') - LENGTH(REPLACE('20077,1;20078,2', ';', NULL)) + 1

)

) t2 ON t1.opus_id = t2.p1

)

SET visit_num = nvl(visit_num, 0) + p2, total_today = nvl(total_today, 0) + p2, total_this_week = nvl(total_this_week, 0) + p2, total_this_month = nvl(total_this_month, 0) + p2

在测试库10.2.0.1通过.

但是拿到线上10.2.0.4,居然报错,这个内部的HINT没有生效.

后来改写为

MERGE INTO mvbox_space.music_original t1

USING (

SELECT REGEXP_SUBSTR(value_str, '[^,]+', 1, 1) AS p1, REGEXP_SUBSTR(value_str, '[^,]+', 1, 2) AS p2

FROM (

SELECT SUBSTR(inlist, INSTR(inlist, ';', 1, LEVEL) + 1, INSTR(inlist, ';', 1, LEVEL + 1) - INSTR(inlist, ';', 1, LEVEL) - 1) AS value_str, LEVEL AS l

FROM (

SELECT ';' || '20077,1;20078,2' || ';' AS inlist

FROM DUAL

)

CONNECT BY LEVEL <= LENGTH('20077,1;20078,2') - LENGTH(REPLACE('20077,1;20078,2', ';', NULL)) + 1

)

) t2 ON t1.opus_id = t2.p1

WHEN MATCHED THEN UPDATE SET t1.visit_num = NVL(t1.visit_num, 0) + t2.p2, t1.total_today = NVL(t1.total_today, 0) + t2.p2, t1.total_this_week = NVL(t1.total_this_week, 0) + t2.p2, t1.total_this_month = NVL(t1.total_this_month, 0) + t2.p2

0b1331709591d260c1c78e86d0c51c18.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值