首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

Oracle数据库Merge Into 怎么使用Sequence 而不“浪费”

2012-11-23 
Oracle数据库Merge Into 如何使用Sequence 而不“浪费”1、问题背景:该问题是在做Data Stage时引出来的一个问

Oracle数据库Merge Into 如何使用Sequence 而不“浪费”

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);-- 创建sequencecreate sequence seq_testminvalue 1maxvalue 999999increment by 1cache 40nocycle;-- 添加测试数据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、测试

merge into targetTest tusing (select id, name,seq_value,t_stamp from sourceTest) son (s.id = t.id and s.name = t.name)when matched then? update set t.seq_value = s.seq_value, t.t_stamp = sysdatewhen not matched then? insert (id, name, seq_value,t_stamp) values (s.id, s.name,test.seq_test.nextval,s.t_stamp);

??第一次执行,结果:

??

???12345???12345678create or replace function get_sequence_nextval(f_schema in varchar2, f_sequence_name in varchar2) return numberis v_nextval number;begin execute immediate 'select ' || f_schema || '.'||f_sequence_name||'.nextval from dual' into v_nextval; return v_nextval;exception when others then raise_application_error(sqlcode,sqlerrm);end;

?

?将3测试中的代码调整为:test.seq_test.nextval? ==> test.get_sequence_nextval('test','seq_test')

?再次调用,我们可以看到三条记录11、12、13已经紧跟着10了。--不浪费了。

?

???12345678910112012-11-19 下午 03:11:46

?

?5、结论及分析:

使用Merge Into调用Sequence 类似于预编译,会直接将值赋组合相应的调用,而不管该matched 或 not matched是否成功执行。而使用一个function进行封闭以后,因为预编译时无法知道该值,所以不会进行预处理,因此也不会浪费sequence的值。但是,使用function来讲,会带来另外一个问题,性能因为无端的增加了一下调用。

所以,根据自己的实际情况,选择适合自己的才是最好的。

热点排行