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