首页 > 其他 > 详细

merge

时间:2019-12-26 15:14:26      阅读:86      评论:0      收藏:0      [点我收藏+]

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 INSERTUPDATE, 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

merge::=

技术分享图片

merge_update_clause ::=

技术分享图片
Description of the illustration ‘‘merge_update_clause.gif‘‘

merge_insert_clause ::=

技术分享图片

error_logging_clause ::=

技术分享图片
Description of the illustration ‘‘error_logging_clause.gif‘‘

====================================================================================================================================

语义学

INTO条款

使用INTO子句可以指定要更新或插入其中的目标表或视图。为了将数据合并到视图中,该视图必须是可更新的。有关更多信息,请参考“关于可更新视图的注释”

对目标视图的限制 您无法指定INSTEAD OF已定义触发器的目标视图

使用条款

使用USING子句可以指定要更新或插入的数据源。源可以是表,视图或子查询的结果。

开子句

使用ON子句可以指定MERGE操作更新或插入的条件。对于目标表中搜索条件为真的每一行,Oracle数据库将使用源表中的相应数据更新该行。如果任何行的条件都不成立,则数据库将根据相应的源表行将其插入目标表。

对ON子句的限制 

在早期版本的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_RLSADD_POLICY statement_types参数,包括INSERTUPDATE,和DELETE语句,或只是省略statement_types参数完全。有关在特定SQL语句类型上执行策略的更多信息,请参考《Oracle数据库安全指南》

merge_update_clause

用于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

merge_insert_clause指定值以插入到目标表的列,如果条件ON子句是假的。如果执行了insert子句,则将激活目标表上定义的所有插入触发器。如果省略INSERT关键字之后的列列表,则目标表中的列数必须与VALUES子句中的值数匹配

要将所有源行插入表中,可以子句条件中使用常量过滤谓词ON常量过滤谓词的一个示例是ON0=1)。Oracle Database识别出这样的谓词,并将所有源行无条件地插入到表中。这种方法与省略merge_update_clause在这种情况下,数据库仍必须执行联接。使用常量过滤器谓词时,不执行连接。

where_clause仅当指定条件为true时,才指定是否要Oracle数据库执行插入操作。该条件只能引用数据源表。Oracle Database对条件不成立的所有行都跳过插入操作。

您可以单独指定此子句,也可以使用merge_update_clause如果您同时指定两者,则它们可以任意顺序排列。

merge_insert_clause的 限制DEFAULT插入视图时无法指定

error_logging_clause

error_logging_clause在一个相同的行为MERGE语句,在INSERT声明。有关更多信息,请参见INSERT语句error_logging_clause

 

 

merge

原文:https://www.cnblogs.com/liang-ning/p/12101595.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!