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 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) BON ( 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
?