设为首页 加入收藏

TOP

Oracle内联视图更新遇到的问题
2015-11-10 12:16:06 来源: 作者: 【 】 浏览:0
Tags: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


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇impdp报错ORA-31631、ORA-39122 下一篇使用JBoss Tool反向创建PO类

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: