风雨十年,感恩同行

两个阜阳项目中的Oracle数据库所做的一个update语句优化方法

[复制链接]
发表于 2018-7-12 22:45:15 | 显示全部楼层 |阅读模式
阜阳市食品药品监督管理局开发项目反映说,执行一个脚本报错全是undo的错误,收到脚本全是如下类似语句
update LLxxx a set bankcode=  nvl(( select code1 from  ldcode1
                                                                   where codetype='xxxxxx'
                                                                    and a .bankcode=xxcode1.code),a.bankcode)
where a.bankcode is not null;
这类语句。
下面上执行计划

这类语句通常用merge into语句来优化
merge into的应用场景:
一段业务逻辑,需要先判断一条记录在数据库中是否有存在,若存在则更新该记录,若不存在则插入记录。
语法:
MERGE INTO table_name alias1 USING (table|view|sub_query) alias2 ON (join condition) WHEN MATCHED THEN UPDATE table_name SET col1 = col_val1,            col2 = col_val2 WHEN NOT MATCHED THEN INSERT (column_list) VALUES (column_values);
修改为如下:
merge into LLXXX A using (select b.code1,c.CLMNO, c."POLNO", c."BATNO", c."BNFKIND", c."INXXXNO", c."BNFNO",
c."CASENO", c."FEEXXXXTYPE", c."CURRENCY" from  LLCODE1 b,LLXXX c where b.codetype='BankCodeToZJXT'
  and c.bankcode=b.code  and c.bankcode is not null) d on  
(A."POLNO"=d."POLNO"
and A."BATNO"=d."BATNO"
and  A."BNFKIND" = d."BNFKIND"
and A."INXXXNO"=d."INXXXNO"
and  A."BNFNO"=d."BNFNO"
and A."CASENO"=d."CASENO"
and A."FEEXXXXTYPE"=d."FEEXXXXTYPE"
and A."CURRENCY"=d."CURRENCY")
WHEN MATCHED THEN
    UPDATE set A.bankcode= d.code1;

执行计划如下:


收工阜阳市重点工程管理局项目请听下回分解

您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

客服咨询

QQ:619920289

服务时间 9:00-22:00

金蝶用友易助管家婆深度服务
 
QQ在线咨询
售前咨询热线
619920289
售后服务热线
243998158
快速回复 返回顶部 返回列表