在一个增量维护的数据库系统中,为了使插入的数据与已存在的数据不重复,需要在插入每条记录时根据关键字段的内容查询数据库中有无重复记录,如果有就使用UPDATE语句更新这条记录,如果没有就使用INSERT插入新记录。 这样的操作方式在操作少量数据时对系统的运行效率不会产生什么影响,但是一旦数据量达到两三百万的时候,每更新一条记录就要搜索一次有无重复,效率也降低很多,也曾想过使用存储过程来实现数据判断导入,客户程序只负责将数据传递给存储过程,由他来执行查询更新操作,但可能速度也不会有质的提高,能不能通过捕获ORACLE的错误提示,比如当我插入一条重复记录时,由于定义的唯一约束,数据库一定会报错,再根据这个错误代码来判断是更新还是插入。请问有人这样实现过么,愿闻其详!
或者有其它更好的解决方法!
或者有其它更好的解决方法!
解决方案 »
- 关于case分支中使用COMMIT出现的问题
- 触发器和存储过程实现2张表的同步
- oracle rollup求解
- 数据库表不建主键,对于程序开发会带来什么缺点?
- 关于当前表与历史表的备份的问题,大家来看看...
- Oracle中的语句级触发器,怎么实现禁止删除表dept中的记录.
- 请问大家在PL/SQL里面怎么用 SQL Window啊?能介绍几个快捷键吗
- 用Ado连接局域网的Oracle8.1.7数据库,连接字符串给什么?不要说很简单哦
- “只取一瓢”、KingSunSha(弱水三千) 请来一下,树形SQL语句的问题。
- orcl出问题,还请大神帮忙解决一下报错问题
- ORACLE以及ADO数据库编程高手请进
- 关于oracle分析函数的使用,谢谢了
具体语法可以google一下
将B中数据不重复的插入A中 MERGE INTO A a
USING B b
ON(a.XH=b.XH)
WHEN NOT MATCHED THEN INSERT--如果不匹配则插入
Values(b.xh,b.xm,b.zym,b.xb,b.cssj,b.zxf,b.bz);
merge into ta a
using (select * from tb ) b
on (a.id = b.id)
when matched then update set a.name = b.name
when not matched then insert (id,name)
values ( b.id,b.name);
可以分批比较,比如每1万merge into 一次。
在存储过程中动态拼 merge into 语句,然后用execute immediate 来执行。如果需要记录错误的话,只能用FORALL 来一条条加sql,然后批量更新