oracle循环执行merge,关于ORACLE中插入,更新(MERGE)的使用

Oracle9i引入了一个新的SQL语句,使用本语句可以在一条语句中连接两个表。

以前要使用UPDATE去更新两个表中都存在的记录,或者用INSERT添加两个合并表中不存在的记录,必须写两个SQL语句,

而现在这两种操作都只要一条SQL MERGE语句就可以实现。

f0cd6c7f9e7ae96feae062cb48f670f0.pngcreatetableinventory (part_nointegerinteger,part_countinteger); 

f0cd6c7f9e7ae96feae062cb48f670f0.png

f0cd6c7f9e7ae96feae062cb48f670f0.pnginsertintoinventoryvalues(1,5);

f0cd6c7f9e7ae96feae062cb48f670f0.png

f0cd6c7f9e7ae96feae062cb48f670f0.pnginsertintoinventoryvalues(3,6); 

f0cd6c7f9e7ae96feae062cb48f670f0.png

f0cd6c7f9e7ae96feae062cb48f670f0.png

f0cd6c7f9e7ae96feae062cb48f670f0.pngcreatetableshipment (part_nointegerinteger,part_countinteger);

f0cd6c7f9e7ae96feae062cb48f670f0.png

f0cd6c7f9e7ae96feae062cb48f670f0.pnginsertintoshipmentvalues(1,2);

f0cd6c7f9e7ae96feae062cb48f670f0.pnginsertintoshipmentvalues(2,2);

f0cd6c7f9e7ae96feae062cb48f670f0.png

f0cd6c7f9e7ae96feae062cb48f670f0.pngMERGEINTOinventory

f0cd6c7f9e7ae96feae062cb48f670f0.png    USING shipment

f0cd6c7f9e7ae96feae062cb48f670f0.pngON(inventory.part_nointeger=shipment.part_nointeger)

f0cd6c7f9e7ae96feae062cb48f670f0.pngWHENMATCHEDTHENf0cd6c7f9e7ae96feae062cb48f670f0.pngUPDATESETinventory.part_count=inventory.part_count+shipment.part_count--注意如果这里前面的part_count字段不指明表名,默认为shipment字段,结果会为4f0cd6c7f9e7ae96feae062cb48f670f0.pngWHENNOTMATCHEDTHENf0cd6c7f9e7ae96feae062cb48f670f0.pngINSERTVALUES(shipment.part_nointeger,shipment.part_count);

f0cd6c7f9e7ae96feae062cb48f670f0.png

f0cd6c7f9e7ae96feae062cb48f670f0.pngcommit;

f0cd6c7f9e7ae96feae062cb48f670f0.pngselect*frominventory;

f0cd6c7f9e7ae96feae062cb48f670f0.png   

f0cd6c7f9e7ae96feae062cb48f670f0.pngtruncatetableinventory;     

34031c708bfe702fe82d01ff5c6593aa.png

0be121fa5b8988fbabbbc526af3b0fc0.gif/**//*587e34b10dcf5efbc0859b53470a2db3.png  PART_NO   PART_COUNT

587e34b10dcf5efbc0859b53470a2db3.png----------              ----------

587e34b10dcf5efbc0859b53470a2db3.png      1                      7

587e34b10dcf5efbc0859b53470a2db3.png      3                      6

587e34b10dcf5efbc0859b53470a2db3.png      2                      2 

587e34b10dcf5efbc0859b53470a2db3.png

587e34b10dcf5efbc0859b53470a2db3.png

执行的结果是shipment数据已经被合并到inventory中,所以与inventory中某些东西相匹配的shipment都会被添加到count中,

而没有得到的匹配的就不会添加到inventory中。

在MERGE语句中必须指定一个WHEN MATCHED和一个WHEN NOT MATHCED语句。

如果除这两种情况之外还有别的情况,你可能就需要使用一个常规的INSERT或者UPDATE语句。

另外一点是MERGE语句一次只能修改一行记录,而且不能修改在ON子句中引用的列。

MERGE语句的目标表(target table)(在本例中是inventory)必须是一个可以使用INSERT语句进行插入或者UPDATE语句进行更新的表或者视图。

源表(source table)(在本例中是shipment)可以是任何的查询表,比如说外部表或者管道化表函数。

posted on 2008-06-12 10:59 有猫相伴的日子 阅读(1511) 评论(0)  编辑  收藏 所属分类: pl/sql

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值