首页 > 其他 > 详细

merge语句导致序序爆增

时间:2020-04-03 14:26:02      阅读:60      评论:0      收藏:0      [点我收藏+]
测试
每次执行时,都会增merge出
create table tabx as select * from dba_objects;
create sequence pub_seq ;
 
merge into tabx t1
using tabx t2 on (t1.object_id=t2.object_id)
WHEN MATCHED THEN
update set t1.owner = t2.owner
WHEN NOT MATCHED THEN
INSERT (object_id)
VALUES(pub_seq.currval);
 
select pub_seq.curval from dual;
 
原因
未知BUG。
可能是merger总是作为整句执行,即使只执行update分枝,也会处理insert分枝中的nextval函数(包一层成自定义函数就不会?)。
即每次merge执行,序列都新增merge结果的条数。
 
 
解决方法
且一个函数包一下序列,让其真正执行时才动到nextval
CREATE OR REPLACE FUNCTION get_sequence(in_sequence  varchar2) RETURN number
IS
  /*====================================================================*/
  /* FUNCTION    : get_sequence
  /* Description : 根据传递进来的序列名为该序列产生唯一值,以解决MERGE INTO带来的序列自增长的问题
  /* Parameters  : in_sequence            序列名称
  /* Version     : 1.0                    --初始版本
  /*
  /*====================================================================*/
  next_val         number;
BEGIN
  execute immediate ‘SELECT ‘||in_sequence||‘.nextval FROM dual‘ INTO next_val;
 RETURN next_val;
EXCEPTION
  WHEN others THEN
   raise_application_error(SQLCODE,SQLERRM);
END;

merge语句导致序序爆增

原文:https://www.cnblogs.com/laverne/p/12625675.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!