`
linfei2008
  • 浏览: 15334 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
文章分类
社区版块
存档分类
最新评论

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

 

分享到:
评论

相关推荐

    ssh+oracle实现登陆注册和增插删改

    例如,添加新记录时,创建一个新的对象,设置属性值,然后调用Session的save()或saveOrUpdate()方法;更新记录时,找到待更新的对象,修改属性,调用Session的update()方法;删除记录则通过Session的delete()方法。 ...

    使用hibernate连接oracle数据库的详细方法,代码实现实现数据库的增删改查.rar

    - **创建(CREATE)**:通过`Session`的`save()`或`saveOrUpdate()`方法保存新实体到数据库。 ```java Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); ...

    ssh框架完成对oracle数据库的增删查改

    创建(Create)操作涉及实体的保存,通过Session的save()或saveOrUpdate()方法;读取(Read)操作通过Query或Criteria API实现,查询结果可以转换为Java对象集合;更新(Update)操作是调用Session的update()方法;...

    SSH+Oracle增删查改

    - **改(Update)**: 修改对象属性后,调用Session的update()或saveOrUpdate()方法,或通过HQL的UPDATE语句实现对象的更新。 在实际开发中,通常会结合Service和DAO层进行业务逻辑处理。Service层封装业务逻辑,...

    HIbernate与oracle数据库应用例子

    - 使用`Session.save()`或`Session.saveOrUpdate()`方法插入新记录。 2. 更新数据 - 使用`Session.update()`更新已存在的实体。 3. 查询数据 - `Session.get()`通过主键获取单个对象。 - `Session.load()`懒...

    SSH简单CURD有Oracle数据库

    1. **创建(Create)**:通过Hibernate的Session接口,可以调用save()或saveOrUpdate()方法将新对象持久化到数据库。Struts2的动作类接收表单数据,然后调用Service层的方法,Service层再调用DAO层的实现。 2. **...

    Hibernate-Oracle-MySQL-image.rar_oracle

    接着,使用Session的`save()`或`saveOrUpdate()`方法保存实体。示例代码如下: ```java FileInputStream fis = new FileInputStream("path/to/image.jpg"); Blob blob = Hibernate.createBlob(fis); Image image...

    NHibernate访问oracle,sqlServer实例

    在Oracle中,可能还需要处理Oracle特有的数据类型,如LONG、BLOB等,通过NHibernate的用户类型或者Type映射实现。 对于SQL Server,NHibernate通常会使用SqlClient驱动。配置连接字符串时,你需要提供Server、...

    oracle 数据按主键删除慢问题的解决方法

    所以将原先使用hibernate的saveOrupdate方法,改查jdbc的 sql语句来处理update和delete数据操作。但是依然没效果!!! 怀疑数据库出问题了!~  于是拿sql语句在PL/SQL客户端执行,查看执行计划。删除和更新都能...

    oracle+hibernate 处理blob +uploadify实例

    具体实现通常会涉及到解析文件项,获取文件内容,创建`Learner`对象并调用Hibernate的`saveOrUpdate`方法来持久化数据。 Uploadify是一个JavaScript库,用于实现前端的文件上传功能,它提供了用户友好的界面和异步...

    基于ssh的增删改查数据库是Oracle

    - **增(Insert)**:使用Hibernate的Session接口的save()或saveOrUpdate()方法,可以将Java对象持久化到数据库中,相当于执行INSERT SQL语句。 - **删(Delete)**:通过Session的delete()方法,可以根据对象的...

    ssh实现模糊查询,分页及增删改查功能

    1. **创建(Create)**:通过SessionFactory的`save()`或`saveOrUpdate()`方法保存新的对象到数据库。 ```java User user = new User(); // set properties... session.save(user); ``` 2. **读取(Read)**:...

    Spring+Hibernate处理Oracle lob字段(一)

    在本文中,我们将深入探讨如何在...通过合理配置和使用相应的API,我们可以有效地管理大体积数据,实现与数据库的高效交互。在实际项目中,根据具体需求和环境,可能还需要考虑性能优化、事务管理和错误处理等问题。

    hibernate动态映射表处理oracle的clob类型

    Oracle 10g提供了多种操作CLOB的方法,包括BFILE、NCLOB、CLOB等,但本话题主要关注CLOB。 2. **Hibernate与CLOB**:Hibernate支持对CLOB类型的映射。在Hibernate的映射文件(.hbm.xml)或使用注解时,可以声明一个...

    SSH框架增删改查源码

    例如,增加数据时,会创建一个新的实体对象,设置其属性,然后调用Session的save()或saveOrUpdate()方法;删除数据则会根据主键获取实体,然后调用Session的delete()方法;更新数据是先获取实体,修改属性,再调用...

    Hibernate基本实现

    - **创建(Create)**:使用Session的`save()`或`saveOrUpdate()`方法保存新对象到数据库。 ```java User user = new User("John Doe"); session.save(user); ``` - **读取(Read)**:通过Session的`get()`...

    hibernate 连接数据库基础源码3

    通过深入理解和实践这些基本步骤,初学者可以快速掌握Hibernate连接Oracle数据库的基本源码实现。在实际项目中,还需要考虑性能优化、缓存策略、级联操作等高级特性,但这个基础已经足够启动你的学习之旅。在day2...

    最新2023阿里java面试题

    4. Hibernate 中的 saveOrUpdate() 方法是干什么的?怎么判断它是要 save 还是 update 呢?(Hibernate 框架) 三、数据库 1. 你用过哪些数据库?(数据库基础知识) 2. Oracle 的分页语句?要最佳的方式,不然要...

    SSH示例代码(带事物和Blob操作的)

    在DAO层,可能会有专门的方法来处理Blob对象的读写操作,例如使用Session的saveOrUpdate()方法保存包含Blob的数据,使用Blob的setBinaryStream()和getBinaryStream()方法进行读写操作。 项目中的单元测试是保证代码...

    hibernate数据库相关操作步骤

    - **保存/插入**:使用`Session`的`save()`或`saveOrUpdate()`方法来保存新实体到数据库。 - **更新**:对已存在的实体进行修改后,调用`Session`的`update()`方法来更新数据库。 - **删除**:通过`Session`的`...

Global site tag (gtag.js) - Google Analytics