1、问题背景:该问题是在做Data Stage时引出来的一个问题,必须使用Merge Into的时候会浪费很多NextVal。
2、测试前提:创建脚本。
-- 创建源表
create table sourceTest(
id int,
name varchar2(100),
seq_value int,
t_stamp date
);
-- 创建目标表
create table targetTest(
id int,
name varchar2(100),
seq_value int,
t_stamp date
);
-- 创建sequence
create sequence seq_test
minvalue 1
maxvalue 999999
increment by 1
cache 40
nocycle;
-- 添加测试数据
insert into sourceTest(id,name,t_Stamp) values(null,null,sysdate);
insert into sourceTest(id,name,t_Stamp) values(1,'one',sysdate - 1);
insert into sourceTest(id,name,t_Stamp) values(2,'two',sysdate - 2);
insert into sourceTest(id,name,t_Stamp) values(3,null,sysdate - 3);
insert into sourceTest(id,name,t_Stamp) values(null,'four',sysdate + 1);
commit;
3、测试
into targetTest t
using (select id, name,seq_value,t_stamp from sourceTest) s
on (s.id = t.id and s.name = t.name)
when matched then
update set t.seq_value = s.seq_value, t.t_stamp = sysdate
when not matched then
insert (id, name, seq_value,t_stamp) values (s.id, s.name,test.seq_test.nextval,s.t_stamp); 第一次执行,结果:
| ID | NAME | SEQ_VALUE | T_STAMP | |
| 1 | one | 1 | 2012-11-17 下午 03:11:46 | |
| 2 | 2 | 2012-11-18 下午 03:11:46 | ||

本文探讨了在Oracle数据库中使用Merge Into语句时如何通过创建函数避免Sequence值的浪费。通过实例测试,作者展示了如何利用函数get_sequence_nextval在不浪费Sequence的情况下执行Merge Into操作,同时指出这种方法虽然解决了值浪费的问题,但可能会影响性能。

3732

被折叠的 条评论
为什么被折叠?



