1

db1 から db2 に 3 つのテーブルをエクスポートしたいと考えていました。

エクスポートを開始する前に、これら 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;

この手順は問題なくコンパイルおよび実行されます。

しかし、デュアルから TEST_SEQ.nextval を選択するなど、シーケンスの最後の値を確認したい場合。

私はまだ「1」を取得します。

私の手順が私のシーケンスに影響を与えなかった理由を誰か教えてもらえますか? ps。私はsqlを渡すためにoracle sql developerperを使用しています。

ありがとう

4

3 に答える 3

2

alter実際には、2 つのステートメント間でシーケンスをインクリメントする必要があります。

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 に答える
0

これは、1 から開始しているためです。select を再度実行すると、期待どおりに増加していることがわかります。シーケンスの開始値も設定する必要があります。

次のようなものを試してください:

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 に答える