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 ;
展开
 我来答
longrenyingdc8ecb1
推荐于2016-11-12 · TA获得超过1万个赞
知道大有可为答主
回答量:6032
采纳率:82%
帮助的人:2382万
展开全部
你这个不仅仅是重复,而且是大量重复吧。
你的游标那里设定的是一个集合,也就是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,当然,我不知道你的业务逻辑,具体的还要你自己看。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式