|
用储存过程批量抽取一个视图的数据,插入到一个新建的表,视图数据有2.4亿,昨天抽取到6千万就卡住了,不知道什么原因,想继续执行这个存储过程,想请问加什么条件来避免插入那些已经插入过的数据
视图上有唯一性字段XH
储存过程如下
create or replace procedure up_table as
type a is table of new_table%rowtype;
in_data a;
i number;
cursor c is select * from fcd_ci_gps@dblink;
begin
open c;
loop
fetch c bulk collect into in_data limit 5000;
forall i in 1..in_data.count
insert into new_table values in_data(i);
commit;
exit when in_data.count=0;
end loop;
close c;
end;
最近刚做了一个你说的类似需求:
我的业务需求是,
从oracle数据库中获取数据,然后同步到sqlserver中。
首先是配置两个数据库之间的连接设置。
我是sqlserver 连接oracle 配置sqlserver的链路服务器就OK。
下面是存储过程的内容了:
1. 创建临时表。
通过远程连接,insert into 临时表 select 远程表 。
获取数据先到本地,。
然后用 临时表的数据,跟你本地业务表的数据进行对比。
查询不通的数据。
Java代码
- --(1)远程读取NC需求计划,分组汇总数据后,插入到临时表#tmp_pl_plan中。
- set@InsertStrSQL=@InsertStrSQL+@tmpStrSQl;
- print(@InsertStrSQL);
- exec(
- select@tmpCont=count(1)from#tmp_pl_plan;
- --state:0新增、1修改、2删除
- 2)用本地数据与临时表中的数据,进行对比,更新本地表中计划数量与临时表中不相等的记录.
- updatetsett.plnum=a.plnum,t.state=1
- from#tmp_pl_plana,NC_PL_PLANt
- wherea.factorycode=t.factorycodeanda.weldingdate=t.weldingdate
- anda.divisions=t.divisionsanda.zzmadeline=t.zzmadeline
- anda.zzweldingwayCode=t.zzweldingwayCodeanda.zzmadelinetypeCode=t.zzmadelinetypeCode
- anda.convertedcode=t.convertedcodeanda.ncfprocode=t.ncfprocode
- andt.plnum!=a.plnum
- andt.weldingdate>=@fbegdateandt.weldingdate<=@fenddate
- 3)对比数据,查找本地表中存在,但是临时表中不存在的记录,然后修改本地表中的数量=0,state=3表示删除
- updatetsett.plnum=2
- fromNC_PL_PLANt
- wheret.weldingdatebetween@fbegdateand andnotexists(
- select1from#tmp_pl_planawherea.factorycode=t.factorycodeanda.weldingdate=t.weldingdate
- );
- 4)对比数据,新增临时表中不存在于当前表的数据
- --deleteNC_PL_PLAN;
- insertintoNC_PL_PLAN
- select*from#tmp_pl_plant
- 1fromNC_PL_PLANawherea.factorycode=t.factorycodeanda.weldingdate=t.weldingdate
- anda.weldingdate>=@fbegdateanda.weldingdate<= )
- orderbyt.weldingdatedesc;
最近刚做了一个你说的类似需求:
我的业务需求是,
从oracle数据库中获取数据,然后同步到sqlserver中。
首先是配置两个数据库之间的连接设置。
我是sqlserver 连接oracle 配置sqlserver的链路服务器就OK。
下面是存储过程的内容了:
1. 创建临时表。
通过远程连接,insert into 临时表 select 远程表 。
获取数据先到本地,。
然后用 临时表的数据,跟你本地业务表的数据进行对比。
查询不通的数据。
Java代码
- 1)远程读取NC需求计划,分组汇总数据后,插入到临时表#tmp_pl_plan中。
- @tmpStrSQl;
- @InsertStrSQL);
-
- 1)from#tmp_pl_plan;
- 2删除
- 2)用本地数据与临时表中的数据,进行对比,更新本地表中计划数量与临时表中不相等的记录.
- 1
- wherea.factorycode=t.factorycodeanda.weldingdate=t.weldingdate
- anda.divisions=t.divisionsanda.zzmadeline=t.zzmadeline
- anda.zzweldingwayCode=t.zzweldingwayCodeanda.zzmadelinetypeCode=t.zzmadelinetypeCode
- anda.convertedcode=t.convertedcodeanda.ncfprocode=t.ncfprocode
- andt.plnum!=a.plnum
- @fenddate
- 3表示删除
- 2
- fromNC_PL_PLANt
- andnotexists(
- 1from#tmp_pl_planawherea.factorycode=t.factorycodeanda.weldingdate=t.weldingdate
- );
- 4)对比数据,新增临时表中不存在于当前表的数据
- --deleteNC_PL_PLAN;
- insertintoNC_PL_PLAN
- select*from#tmp_pl_plant
- 1fromNC_PL_PLANawherea.factorycode=t.factorycodeanda.weldingdate=t.weldingdate
- )
- orderbyt.weldingdatedesc;
第一:merge into 就是最快的表更新方案了,merge into 能够去除重复数据,插入新数据,我不知道你为什么不用merge into。
第二: 如果你不信任merge into,那么你可以在被更新的数据表中对唯一标识的列建立索引(index),这样你在直接使用游标将一个表对另外一个表更新的时候会快很多很多。
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!