oracle save or update,oracle 兑现saveOrUpdate方法

oracle 实现saveOrUpdate方法

在oracle 9i和更高版本中,提供了一个新的函数 merge into。通过它,我们可以实现类似hibernate的saveOrUpdate的方法。

在oracle 10G则进行 了增强,可参考http://tomszrp.itpub.net/post/11835/263865

先介绍下 merge into

[code="java"]MERGE [ hint ]

INTO [ schema. ]table A

USING [ schema. ] { table | view | subquery } B

ON ( condition )

[ merge_update_clause ]

[ merge_insert_clause ] ;

WHEN MATCHED THEN

UPDATE SET column = { expr | DEFAULT }

[, column = { expr | DEFAULT } ]...

[ where_clause ]

[ DELETE where_clause ]

WHEN NOT MATCHED THEN

INSERT [ (column [, column ]...) ]

VALUES ({ expr [, expr ]... | DEFAULT })

[ where_clause ]

WHERE condition

需要注意的地方:

①9i已经支持了,是Merge,但是只支持select子查询,

如果是单条数据记录,可以写作select …… from dual的子查询

②update 中不能出现 on 中的列

MERGE INTO T T1

USING (SELECT a,b FROM T WHERE t.a='1001') T2

ON ( T1.a=T2.a)

WHEN MATCHED THEN

UPDATE SET T1.b = 2

WHEN NOT MATCHED THEN

INSERT (a,b) VALUES('1001',2);

其实在Oracle中Merge语句原先是用来进行整表的更新用的,也就是ETL工具比较常用的语法,重点是在Using上。

用中文来解释Merge语法,就是:在B中Select出来的数据,每一条都跟A进行 ON (join condition)的比较,如果匹配,就进行更新的操作(Update),如果不匹配,就进行插入操作(Insert)。

因此,严格意义上讲,"在一个同时存在Insert和Update语法的Merge语句中,总共Insert/Update的记录数,就是Using语句中B的记录数。"

以上这句话也就很好的解释了在上面写的语句为何只能进行Update,而不能进行Insert了,因为都Select不到数据,如何能进行Insert呢:)

下面就是自己程序中实际的例子中语句:

MERGE INTO dl_fpgydfx A

USING (SELECT '2011-12-26' AS a,545 AS b ,545 AS c,545 AS d,545 AS e,'gc' AS f,'all' AS g FROM dual) B

ON ( A.RQ=B.a and A.BM=B.f and A.SBDM=B.g)

WHEN MATCHED THEN

UPDATE set A.FENG=900

WHEN NOT MATCHED THEN

INSERT VALUES ('2011-12-26',545,332,522,241,'gc','all')

该语句实现的是对于'2011-12-26',545,332,522,241,'gc','all'记录 判断在dl_fpgydfx 中是否存在,存在则update,不存在则进行插入操作。

若进行批量更新,则需要将要更新的记录放到B表里面,然后就可以实现批量更新了。

参考文章:

http://space.itpub.net/559237/viewspace-402876

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值