Purpose
Use the MERGE statement to select rows from one or more sources for update or insertion into a table or view. You can specify conditions to determine whether to update or insert into the target table or view.
This statement is a convenient way to combine multiple operations. It lets you avoid multiple INSERT, UPDATE, and DELETE DML statements.
MERGE is a deterministic statement. You cannot update the same row of the target table multiple times in the same MERGE statement.
Prerequisites
You must have the INSERT and UPDATE object privileges on the target table and the READ or SELECT object privilege on the source table. To specify the DELETE clause of the merge_update_clause, you must also have the DELETE object privilege on the target table.
Syntax


Description of the illustration ‘‘merge_update_clause.gif‘‘


Description of the illustration ‘‘error_logging_clause.gif‘‘
====================================================================================================================================
语义学
使用INTO子句可以指定要更新或插入其中的目标表或视图。为了将数据合并到视图中,该视图必须是可更新的。有关更多信息,请参考“关于可更新视图的注释”。
对目标视图的限制 您无法指定INSTEAD OF已定义触发器的目标视图。
使用USING子句可以指定要更新或插入的数据源。源可以是表,视图或子查询的结果。
使用ON子句可以指定MERGE操作更新或插入的条件。对于目标表中搜索条件为真的每一行,Oracle数据库将使用源表中的相应数据更新该行。如果任何行的条件都不成立,则数据库将根据相应的源表行将其插入目标表。
在早期版本的Oracle数据库中,当您在包含该MERGE INTO语句的应用程序上创建Oracle虚拟专用数据库策略时,由于存在虚拟专用数据库策略,该MERGE INTO语句将被阻止并显示ORA-28132: Merge into syntax does not support security policies错误。从Oracle Database 11 g第2版??(11.2.0.2)开始,您可以在包含MERGE INTO操作的应用程序上创建策略。为此,请在中DBMS_RLS。ADD_POLICY statement_types参数,包括INSERT,UPDATE,和DELETE语句,或只是省略statement_types参数完全。有关在特定SQL语句类型上执行策略的更多信息,请参考《Oracle数据库安全指南》。
用于merge_update_clause指定目标表的新列值。如果ON子句的条件为true,则Oracle执行此更新。如果执行update子句,则将激活目标表上定义的所有更新触发器。
where_clause仅当指定条件为true时,才指定是否要数据库执行更新操作。该条件可以引用数据源或目标表。如果条件不成立,则在将行合并到表中时,数据库将跳过更新操作。
指定DELETE where_clause在填充或更新表时清除表中的数据。受此子句影响的唯一行是目标表中由合并操作更新的行。该DELETE WHERE条件对更新后的值,而不是由评估原值UPDATE SET... WHERE条件。如果目标表的行满足DELETE条件,但未包含在该ON子句定义的联接中,则不会删除该行。对于每行删除,将激活目标表上定义的所有删除触发器。
您可以单独指定此子句,也可以使用merge_insert_clause。如果您同时指定两者,则它们可以任意顺序排列。
对merge_update_clause的 限制此子句受以下限制:
您不能更新该ON condition子句中引用的列。
您无法DEFAULT在更新视图时指定。
的merge_insert_clause指定值以插入到目标表的列,如果条件ON子句是假的。如果执行了insert子句,则将激活目标表上定义的所有插入触发器。如果省略INSERT关键字之后的列列表,则目标表中的列数必须与VALUES子句中的值数匹配。
要将所有源行插入表中,可以在子句条件中使用常量过滤谓词ON。常量过滤谓词的一个示例是ON(0=1)。Oracle Database识别出这样的谓词,并将所有源行无条件地插入到表中。这种方法与省略merge_update_clause。在这种情况下,数据库仍必须执行联接。使用常量过滤器谓词时,不执行连接。
where_clause仅当指定条件为true时,才指定是否要Oracle数据库执行插入操作。该条件只能引用数据源表。Oracle Database对条件不成立的所有行都跳过插入操作。
您可以单独指定此子句,也可以使用merge_update_clause。如果您同时指定两者,则它们可以任意顺序排列。
对merge_insert_clause的 限制DEFAULT插入视图时无法指定。
该error_logging_clause在一个相同的行为MERGE语句,在INSERT声明。有关更多信息,请参见INSERT语句error_logging_clause。
原文:https://www.cnblogs.com/liang-ning/p/12101595.html