oracle merge的使用

2025-03-11 05:39:33
推荐回答(3个)
回答1:

Oracle9i引入了MERGE命令,你能够在一个SQL语句中对一个表同时执行inserts和updates操作. MERGE命令从一个或多个数据源中选择行来updating或inserting到一个或多个表.在Oracle10g中MERGE有如下一些改进:
1、UPDATE或INSERT子句是可选的
2、UPDATE和INSERT子句可以加WHERE子句
3、在ON条件中使用常量过滤谓词来insert所有的行到目标表中,不需要连接源表和目标表
4、UPDATE子句后面可以跟DELETE子句来去除一些不需要的行
语法:
MERGEHINTINTO SCHEMA .TABLE T_ALIAS
USINGSCHEMA . {TABLE | VIEW |SUBQUERY } T_ALIAS
ON (CONDITION)
WHENMATCHEDTHEN MERGE_UPDATE_CLAUSE
WHENNOTMATCHED THEN MERGE_INSERT_CLAUSE / MERGE_DELETE_CLAUSE;

回答2:

merge语句不能更新on子句引用的字段,你这里on子句 on (us.id=us2.id)引用了us2.id字段,在update子句又想更新us2.id,这是不允许的,因此报错
解决办法就是去掉update子句里更新us2.id的部分
merge into us2
using us
on (us.id=us2.id)
when matched then update set us2.name=us.name,us2.password=us.password
when not matched then insert values(us.id,us.name,us.password)

回答3:

看你的业务逻辑是否复杂.
如果简单的, 可以一句 merge 语句就处理掉的。
那么当然优先使用 merge 处理比较好。

假如业务逻辑很复杂, 一句 merge 语句无法处理。
迫不得已,只能使用 游标处理的。
可以尝试使用 BULK COLLECT
看看是否能有一些性能上面的提升