我想将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。
由于
答案 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;