ORACLE存储过程同步表数据出现重复,存储过程如下
createorreplaceprocedurecc_busi_form_to_gtisErrorStringvarChar2(4000);CURSORformidISs...
create or replace procedure cc_busi_form_to_gt is
ErrorString varChar2(4000);
CURSOR formid IS select form_id as formid from cc_busi_form;
begin
for i in formid loop
begin
insert into cc_busi_form select form.*,'hx' from cc_busi_form@LINK_HX form where form.form_id<>i.formid ;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
ErrorString:=SQLERRM;
Insert into cc_run_procedure(run_time,procedure_name,run_result,error_reason) values (sysdate(),'cc_busi_form_to_gt ','运行报错,ErrorString);
Commit;
end;
end loop;
Insert into cc_run_procedure(run_time,procedure_name,run_result,error_reason) values (sysdate(),'cc_busi_form_to_gt ','运行结束,'');
commit;
end cc_busi_form_to_gt ; 展开
ErrorString varChar2(4000);
CURSOR formid IS select form_id as formid from cc_busi_form;
begin
for i in formid loop
begin
insert into cc_busi_form select form.*,'hx' from cc_busi_form@LINK_HX form where form.form_id<>i.formid ;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
ErrorString:=SQLERRM;
Insert into cc_run_procedure(run_time,procedure_name,run_result,error_reason) values (sysdate(),'cc_busi_form_to_gt ','运行报错,ErrorString);
Commit;
end;
end loop;
Insert into cc_run_procedure(run_time,procedure_name,run_result,error_reason) values (sysdate(),'cc_busi_form_to_gt ','运行结束,'');
commit;
end cc_busi_form_to_gt ; 展开
1个回答
展开全部
你这个不仅仅是重复,而且是大量重复吧。
你的游标那里设定的是一个集合,也就是select form_id as formid from cc_busi_form。
我们假设他有三个值,0,1,2
那么在下面循环时(for i in formid loop),我们假设每次读取一个值,第一次读取0,那么后面的语句就变为
insert into cc_busi_form select form.*,'hx' from cc_busi_form@LINK_HX form where form.form_id<>0
也就是说form.form_id=1或2是插入的。
第二次i.formid=1,那么form.form_id=0或2是插入的,这时form.form_id=2这部分就重复了。
第三次i.formid=2,那么form.form_id=0或1是插入的,这时form.form_id=0和1这两部分就都重复了。也就是说你插入的数据是原来数据的二倍的量。
你的formid越多,重复的量也就越大,大概是(formid的个数-1)倍(如果每个formid都不同,那么就是它,如果有重复,那么会有一定出入)。
其实没必要用游标,直接用子查询就行 not in 或者not exsit,当然,我不知道你的业务逻辑,具体的还要你自己看。
你的游标那里设定的是一个集合,也就是select form_id as formid from cc_busi_form。
我们假设他有三个值,0,1,2
那么在下面循环时(for i in formid loop),我们假设每次读取一个值,第一次读取0,那么后面的语句就变为
insert into cc_busi_form select form.*,'hx' from cc_busi_form@LINK_HX form where form.form_id<>0
也就是说form.form_id=1或2是插入的。
第二次i.formid=1,那么form.form_id=0或2是插入的,这时form.form_id=2这部分就重复了。
第三次i.formid=2,那么form.form_id=0或1是插入的,这时form.form_id=0和1这两部分就都重复了。也就是说你插入的数据是原来数据的二倍的量。
你的formid越多,重复的量也就越大,大概是(formid的个数-1)倍(如果每个formid都不同,那么就是它,如果有重复,那么会有一定出入)。
其实没必要用游标,直接用子查询就行 not in 或者not exsit,当然,我不知道你的业务逻辑,具体的还要你自己看。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询