2012-10-17 115 views
1

我想从db1中将3个表导出到db2中。oracle序列初始化

出口开始前,我会为那些3个表序列。

CREATE SEQUENCE TEST_SEQ START WITH 1 INCREMENT BY 1; 

导出后,我将重新初始化sequnce值以匹配表中的max(id)+ 1。

CREATE OR REPLACE PROCEDURE "TEST_SEQUENCE" 
AUTHID CURRENT_USER 
is 
v_num number; 
begin 
select max(ID) into v_num from TABLE_1; 
EXECUTE IMMEDIATE 'ALTER SEQUENCE TEST_SEQ INCREMENT BY ' || v_num; 
EXECUTE IMMEDIATE 'ALTER SEQUENCE 1TEST_SEQ INCREMENT BY 1'; 
end; 
/
show errors; 
execute TEST_SEQ; 

该过程编译和执行没有问题。

但是,当我想检查序列的最后一个值时,如 从dual选择TEST_SEQ.nextval;

我仍然得到“1”。

有人能告诉我为什么我的程序不会影响我的序列吗? ps。我正在使用oracle sql developper传递sql。

感谢

回答

2

你需要真正使两个alter语句之间的序列增量:

EXECUTE IMMEDIATE 'ALTER SEQUENCE TEST_SEQ INCREMENT BY ' || v_num; 
select test_seq.nextval into v_num from dual; 
EXECUTE IMMEDIATE 'ALTER SEQUENCE TEST_SEQ INCREMENT BY 1'; 

在11g中,您可以直接分配的顺序:

v_num := test_seq.nextval; 

无论哪种方式,你不不需要做任何有价值的事情,你只需要生成它。

或者你可以在加载后创建序列,并将根据您刚刚加载什么起始值。

+0

谢谢,我忘了增加我的顺序!您的解决方案有效 – gospodin

0

那是因为你是从1开始,如果你运行你的再次选择,你会发现你期待已递增。您还需要设置序列的起始值。

尝试类似:

create sequence xxx start with 100 increment by 10; 

或者更具体地说:

EXECUTE IMMEDIATE 'ALTER SEQUENCE TEST_SEQ start with ' || v_num || 'INCREMENT BY ' || v_num; 
1
ALTER SEQUENCE TEST_SEQ INCREMENT BY 1000; 

不改变序列的实际值。你必须选择TEST_SEQ.nextval,你会被1000

增加实际值您有几个posibileties如何解决你的问题。

1)顺序跌落,开创再次

CREATE SEQUENCE test_seq INCREMENT BY 1 START WITH xxxx; 

其中xxxx是你的新号码。通过放弃顺序,你失去了授予它的特权,你必须再次授予它们。

2)使用你的方式,但稍加修改

ALTER SEQUENCE test_seq INCREMENT BY yyy; 
SELECT test_seq.nextval FROM dual; 
ALTER SEQUENCE test_seq INCREMENT BY 1; 

其中yyy是实际序列号和新的值在PLSQL环

3)移位的序列号之间的差值。