ORACLE MERGE INTO UPDATE DELETE 用法

使用该MERGE语句从一个或多个源中选择行以进行更新或插入表或视图。您可以指定条件以确定是更新还是插入目标表或视图。

此语句是组合多个操作的便捷方式。它可以让你避免多次INSERT,UPDATE和DELETEDML语句。MERGE是一个确定性的陈述。您无法在同一MERGE语句中多次更新目标表的同一行。

1.1先决条件

您必须具有INSERT与UPDATE目标表和对象的权限READ或SELECT源表上的对象权限。要指定DELETE子句merge_update_clause,还必须DELETE在目标表上具有对象特权。

1.2句法

merge :: =

注意:您必须至少指定其中一个条款merge_update_clausemerge_insert_clause

merge_update_clause :: =

merge_insert_clause :: =

where_clause :: =

error_logging_clause :: =

1.3关于INTO 说明

使用该INTO子句指定要更新或插入的目标表或视图。为了将数据合并到视图中,视图必须是可更新的。

对目标视图的限制

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

1.4关于ON 说明

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

ON条款的限制

在以前版本的Oracle数据库中,当您在包含该MERGE INTO语句的应用程序上创建Oracle虚拟专用数据库策略时,由于存在虚拟专用数据库策略,该MERGE INTO语句将被阻止并出现ORA-28132: Merge into syntax does not support security policies错误。从Oracle Database 11g第2版(11.2.0.2)开始,您可以在包含MERGE INTO操作的应用程序上创建策略。要做到这一点,在DBMS_RLS。ADD_POLICY statement_types参数,包括INSERT,UPDATE,和DELETE语句,或只是省略statement_types参数完全。有关对特定SQL语句类型实施策略的详细信息,请参阅“ Oracle数据库安全指南

1.5     merge_update_clause

merge_update_clause指定目标表的新列值。如果ON子句的条件为真,Oracle将执行此更新。如果执行update子句,则激活目标表上定义的所有更新触发器。

指定where_clause,如果你想在数据库中执行仅当指定条件为真更新操作。条件可以指数据源或目标表。如果条件不为true,则数据库会在将行合并到表中时跳过更新操作。

指定DELETE where_clause填充或更新表时清理表中的数据。受此子句影响的唯一行是目标表中由合并操作更新的那些行。该DELETE WHERE条件对更新后的值,而不是由评估原值UPDATE SET... WHERE条件。如果目标表的一行符合DELETE条件但未包含在ON子句定义的连接中,则不会删除它。对于每行删除,将激活目标表上定义的任何删除触发器。

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

: delele 只能跟update 一起使用,同时where只能出现一次,如果update 使用了wheredelete后面的where就无效了。

 

merge_update_clause限制

本条款受以下限制:

  • 您无法更新ON condition子句中引用的列。
  • 您无法在更新视图时指定DEFAULT。

1.6     merge_insert_clause

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

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

指定where_clause,如果你想Oracle数据库执行插入操作仅当指定条件为真。条件只能引用数据源表。Oracle数据库会跳过条件不为真的所有行的插入操作。

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

merge_insert_clause限制

DEFAULT插入视图时无法指定。

1.7MERGE 示例

1.7.1示例一

以下示例使用bonuses示例模式中的表,oe默认奖励为100.然后bonuses,根据表的sales_rep_id列,将所有进行销售的员工插入到oe.orders表中。最后,人力资源经理决定薪水为8000美元或更低的员工应该获得奖金。那些没有进行销售的人可以获得1%的工资奖金。那些已经进行销售的人的奖金增加相当于他们工资的1%。该MERGE语句只需一步即可实现这些更改:

CREATE TABLE bonuses (employee_id NUMBER, bonus NUMBER DEFAULT 100);

INSERT INTO bonuses(employee_id)

(SELECT e.employee_id FROM employees e, orders o

WHERE e.employee_id = o.sales_rep_id

GROUP BY e.employee_id);

SELECT * FROM bonuses ORDER BY employee_id;

EMPLOYEE_ID      BONUS

----------- ----------

153        100

154        100

155        100

156        100

158        100

159        100

160        100

161        100

163        100

MERGE INTO bonuses D

USING (SELECT employee_id, salary, department_id FROM employees

WHERE department_id = 80) S

ON (D.employee_id = S.employee_id)

WHEN MATCHED THEN UPDATE SET D.bonus = D.bonus + S.salary*.01

DELETE WHERE (S.salary > 8000)

WHEN NOT MATCHED THEN INSERT (D.employee_id, D.bonus)

VALUES (S.employee_id, S.salary*.01)

WHERE (S.salary <= 8000);

SELECT * FROM bonuses ORDER BY employee_id;

EMPLOYEE_ID      BONUS

----------- ----------

153        180

154        175

155170

159        180

160        175

161        170

164         72

165         68

166         64

167         62

171         74

172         73

173         61

179         62

参考:https://docs.oracle.com/en/database/oracle/oracle-database/12.2/sqlrf/MERGE.html#GUID-5692CCB7-24D9-4C0E-81A7-A22436DC968F

1.7.2示例二

目标:从T_TAR表中删除ID 在T_ORG表中存在的记录,将ID在T_ORG中存在,而在T_TAR 中不存在,且TPYE类型为TABLE的记录插入到T_TAR表中。

环境建立:

Create table T_ORG (ID NUMBER ,NAME VARCHAR2(30), TYPE VARCHAR2(19));

Create table T_TAR (ID NUMBER ,NAME VARCHAR2(30), TYPE VARCHAR2(19));

INSERT INTO T_ORG SELECT ROWNUM, OBJECT_NAME ,OBJECT_TYPE FROM ALL_OBJECTS;

INSERT INTO T_TAR SELECT * FROM T_ORG WHERE TYPE=’INDEX’;

COMMIT;

Set timing on

Set autot on

Set linesize 160

alter system flush buffer_cache;

alter system flush shared_pool;

truncate table T_TAR;

truncate table T_ORG;

TRUNCATE TABLE T_ORG;

TRUNCATE TABLE T_TAR ;

INSERT INTO T_ORG SELECT ROWNUM, OBJECT_NAME ,OBJECT_TYPE FROM ALL_OBJECTS;

INSERT INTO T_TAR SELECT * FROM T_ORG WHERE TYPE='INDEX';

commit ;

MERGE INTO T_TAR t

USING T_ORG O

ON (t.id=o.id)

WHEN MATCHED THEN

updateset t.name = t.name

DELETE WHERE (t.id=o.id)

WHEN NOT MATCHED THEN

INSERTvalues (o.id,o.name,o.type) WHERE (o.type='TABLE') ;

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

 
 
 
 

ORACLE MERGE INTO UPDATE DELETE 用法的更多相关文章

  1. MyBatis从入门到精通(第2章):MyBatis XML方式的基本用法【insert用法、update用法、delete用法】

    2.4  insert 用法 2.4.1  简单的 insert方法 在接口 UserMapper.java 中添加如下方法. /** * 新增用户 * @param sysUser * @retur ...

  2. oracle Plsql 运行update或者delete时卡死问题解决的方法

    oracle Plsql 运行update或者delete时 遇到过Plsql卡死问题或者导致代码运行sql的时候就卡死. 在开发中遇到此问题的时候,本来把sql复制出来,在plsql中运行,Sql本 ...

  3. MyBatis从入门到精通:update用法、delete用法

    update用法: 1.接口类中添加的方法: int updateById(SysUser sysUser); 2.映射文件中添加的代码: <update id="updateById ...

  4. insert update delete 语法 以及用法

    insert update delete 被称为 数据定义语句语句 也就是数据的增加 修改 删除 其中不包括查询 譬如: create database -创建数据库 alter database - ...

  5. mssql sqlserver update delete表别名用法简介

    转自:http://www.maomao365.com/?p=6973  摘要: 在sql脚本编写中,如果需要在update delete 中使用表别名的方法,必须按照一定的规则编写,否则将会出现相应 ...

  6. Oracle merge

    oracle merge 語法:

  7. oracle merge into与sqlserver merge into 比较

    merge into: 在两个表之间,根据与源表联接的结果,对目标表执行插入.更新或删除操作. Oracle在9i引入了merge into命令,SQL Server 2008也引入merge int ...

  8. Oracle Merge into 详细介绍

    Oracle Merge into 详细介绍 /*Merge into 详细介绍MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句.通过MERGE语句,根据一张表或子查 ...

  9. PHP5: mysqli 插入, 查询, 更新和删除 Insert Update Delete Using mysqli (CRUD)

    原文: PHP5: mysqli 插入, 查询, 更新和删除  Insert Update Delete Using mysqli (CRUD) PHP 5 及以上版本建议使用以下方式连接 MySQL ...

随机推荐

  1. composer 更新

    composer self-update --preview 清除缓存 composer clearcache

  2. javascript总结47: JS动画原理&jQuery 效果- 各种动画

    1 动画的原理就是: 盒子本身的位置+步长 2 什么是步长? var box=document.getElementById('box'); btn.onclick = function() { // ...

  3. Boost学习之语法解析器--Spirit

    Boost.Spirit能使我们轻松地编写出一个简单脚本的语法解析器,它巧妙利用了元编程并重载了大量的C++操作符使得我们能够在C++里直接使用类似EBNF的语法构造出一个完整的语法解析器(同时也把C ...

  4. 设计模式15:Interpreter 解释器模式(行为型模式)

    Interpreter 解释器模式(行为型模式) 动机(Motivation) 在软件构建过程中,如果某一特定领域的问题比较复杂,类似的模式不断重复出现,如果使用普通的编程方式来实现将面临非常频繁的变 ...

  5. 在java中对数据库进行增删改查

    1.java连接MySql数据库 代码区域: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ...

  6. XJOI 3601 技能(贪心+二分)

    题目描述: 有一个oier,他有n个算法技能,每个技能有一个水平值,每个技能的水平上限都是A,设这个oier有cnt个技能达到了A, 设所有水平值的最小值为mi,那么这个oier的战斗力为cnt×Cf ...

  7. Linux RPM学习笔记

    RPM(RedHat Package Manager) rp-pppoe-3.1-5.i386.rpm软件名称-版本号-编译次数-适合的硬件平台.扩展名 xxx-devel.rpm开发使用 xxx.n ...

  8. leetcode 有效的数独

    判断一个 9x9 的数独是否有效.只需要根据以下规则,验证已经填入的数字是否有效即可. 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗实线分隔的 ...

  9. C++静态成员和非静态成员的区别和使用

    C++静态成员和非静态成员的区别和使用 对象与对象之间的成员变量是相互独立的.要想共用数据,则需要使用静态成员和静态方法. 只要在类中声明静态成员变量,即使不定义对象,也可以为静态成员变量分配空间,进 ...

  10. ZKEACMS 的两种发布方式

    前言 如果你还不知道ZKEACMS,不妨先了解一下. ASP.NET MVC 开源建站系统 ZKEACMS 推荐,从此网站“拼”起来 官方地址:http://www.zkea.net/zkeacms ...