【发布时间】:2012-05-10 02:49:32
【问题描述】:
我正在尝试创建一个脚本来将数据从一个数据库迁移到另一个数据库。我目前无法做的一件事是将序列的 nextval 设置为另一个数据库中序列的 nextval。
我从 user_sequences 中得到了不同的值,并生成了以下动态 SQL 语句:
execute immediate 'alter sequence myseq increment by 100';
execute immediate 'select myseq.nextval from dual';
execute immediate 'alter sequence myseq increment by 1';
commit;
但是什么也没发生。我错过了什么?如果我在程序之外运行相同的语句,它们就可以正常工作:
alter sequence myseq increment by 100;
select myseq.nextval from dual;
alter sequence myseq increment by 1;
commit;
编辑:向所有不清楚的人道歉。我实际上正在改变同一个数据库中的序列。我只是从远程数据库中获取要设置的值。也许没有必要提及远程数据库,因为它不会影响事物。我只是提到它来解释我的目标是什么。
第 1 步。我从远程数据库获取序列的下一个值。
select (select last_number
from dba_sequences@remoteDB
where upper(sequence_name) = upper(v_sequence_name)) - (select last_number
from user_sequences
where upper(sequence_name) = upper(v_sequence_name)) increment_by
from dual;
第 2 步。我使用此值生成动态 SQL 语句:
execute immediate 'alter sequence myseq increment by 100';
execute immediate 'select myseq.nextval from dual';
execute immediate 'alter sequence myseq increment by 1';
commit;
没有引发错误,但什么也没发生。当我使用 DBMS_OUTPUT.PUT_LINE 编写 SQL 语句并在外部运行它们时,它们起作用了。
【问题讨论】:
-
@[APC] 是的,我没有收到任何错误消息(记录了错误)。抱歉,我之前不清楚 - 我实际上是从拥有它的同一个数据库中更改序列。 PL/SQL 过程成功完成。我正在使用 10g 10.2.0.5.0 - 64bi
-
嗯,我只是在没有动态 SQL 的情况下尝试了它 - 我不会在 PL/SQL 块中放入任何更改语句,除非它是动态 SQL。它说“在期待以下之一时遇到符号“ALTER”......”。我的目的是有一个程序可以在需要时运行以刷新数据。而且我需要一个 PL/SQL 块来从远程 DB 中获取值——它不能与子查询一起使用来获取“alter sequence myseq increment by X”的值:
-
@[APC] 嗯,我只是在没有动态 SQL 的情况下尝试了它 - 我不会在 PL/SQL 块中放入任何更改语句,除非它是动态 SQL。它说“在期待以下之一时遇到符号“ALTER”......”。我的目的是有一个程序可以在需要时运行以刷新数据。而且我需要一个 PL/SQL 块来从远程 DB 中获取值——它不能与子查询一起使用来获取“alter sequence myseq increment by X”的值。
标签: oracle plsql sequence dynamic-sql