1

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

在导出开始之前,我将为这 3 个表创建序列。

CREATE SEQUENCE TEST_SEQ START WITH 1 INCREMENT BY 1;

导出后,我将重新初始化序列值以匹配表中的 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;

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

但是当我想检查序列的最后一个值时,比如 select TEST_SEQ.nextval from dual;

我仍然得到“1”。

有人能告诉我为什么我的程序没有影响我的顺序吗?附言。我正在使用oracle sql developer来传递sql。

谢谢

4

3 回答 3

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;

无论哪种方式,您都不需要对该值做任何事情,您只需要生成它。

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

于 2012-10-17T10:53:52.117 回答
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 循环中移动序列号。

于 2012-10-17T11:01:43.743 回答
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;
于 2012-10-17T10:54:14.447 回答