oracle sequence init

时间:2012-10-17 10:39:43

标签: sql oracle sequence

我想将db1中的3个表导出到db2。

在导出开始之前,我将为这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。

由于

3 个答案:

答案 0 :(得分: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;

无论哪种方式,您都不需要对该值执行任何操作,只需要生成它。

或者,您可以在加载后创建序列,并根据刚刚加载的内容设置起始值。

答案 1 :(得分:1)

ALTER SEQUENCE TEST_SEQ  INCREMENT BY 1000;

不会改变序列的实际值。您必须选择TEST_SEQ.nextval,然后将实际值增加1000。

如何解决问题,你有几个缺点。

1)DROP序列和再次创建

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是实际序列号和新值之间的差异

3)在PLSQL循环中移位序列号。

答案 2 :(得分: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;