2012-03-07 4 views
7

DMLアクセスのみで一連のシーケンスを転送する必要があります。コードのバグのために、シーケンスなしでいくつかの値が手作業で取得されたので、シーケンスはこれらの値を複製しています。ですから、次のnextvalが呼び出されるようにシーケンスを最大値にプッシュしたいと思います。これは最大値よりも高い値を与えます。私は約50個の配列を持っていますが、それぞれが数千個前に進む必要があります。シーケンスを手動で転送する - oracle sql

これはDMLアクセスのみで可能ですか?もしそうなら、どうすればいいのですか?

答えて

8

あなたはこれを行うには、動的SQLを使用することができます。たとえば、このコードは、シーケンスのリストのそれぞれから次の10,000の値を選択します。あなたは配列に対してDDLを発行する能力を持っていた場合

DECLARE 
    l_num INTEGER; 
BEGIN 
    FOR seq IN (select * 
       from all_sequences 
       where sequence_name in (<<list of 50 sequences>>) 
        and sequence_owner = <<owner of sequences>>) 
    LOOP 
    FOR i IN 1 .. 10000 
    LOOP 
     execute immediate 
     'select ' || seq.sequence_owner || '.' || seq.sequence_name || '.nextval from dual' 
     into l_num; 
    END LOOP; 
    END LOOP; 
END; 

、あなたはシーケンスから一つの値を選択し、INCREMENT 10,000を設定するために同様のアプローチを使用することができ、かつ1まで戻ってINCREMENTを設定(または任意のそれは今です)。

+0

これは素晴らしいです。私は自動的にこれを行うには、関連する列の最大値からシーケンスの次の値を減算することによって、各シーケンスに必要なループの数を計算することができます。私はSQLがそのような機能を持っていたことに気付かなかった。ありがとうございました! – Jeremy

2

あなただけ

select seq.nextval from dual 

が十分な大きさになるまで...

+0

私は約50個の配列を持っていますが、それぞれが数千個前に進む必要があります。 – Jeremy

+0

PLSQLを実行できますか? – Randy

1

シーケンスを別の値で再起動するには、それを削除して再作成する必要があります。

ALTER SEQUENCEhereのOracleドキュメントを参照してください。

のでCREATE SEQUENCEhere

ための、いや私はランディが提案するようにあなただけの繰り返しインクリメントしない限り、それは、DMLアクセス可能だとは思わないでください。

4

シーケンスの次の値と必要な値の差を判断する必要があります。必要な値は通常、主キー列の最大値です(ID名とします)。

DECLARE 
    maxid NUMBER; 
    maxseq NUMBER; 
    temp NUMBER; -- without this variable Oracle would skip to query the sequence 
BEGIN 
    SELECT MAX(ID) INTO maxid FROM MYTABLE; 
    SELECT MYSEQ.NEXTVAL INTO maxseq FROM DUAL; 
    FOR i IN maxseq .. maxid LOOP 
     SELECT MYSEQ.NEXTVAL INTO temp FROM DUAL; 
    END LOOP; 
END; 
/
1

シーケンスに追加する量以上の行のテーブルがある場合は、次のように動作します。これにより、各シーケンスは同じ量だけ増分されますが、これはあなたには合わないかもしれませんが、PL/SQLやシーケンスの削除/再作成を必要とせずにすばやく簡単です。私は開発の前にサーバーのシーケンスを生成したいときはいつも使っています。

SELECT seq1.nextval, seq2.nextval, ..., seqN.nextval 
    FROM very_large_table 
WHERE ROWNUM <= number_of_rows_to_add 
関連する問題