2009-09-03 7 views
4

私はテーブルの主キーの最大値と配列の値を設定するPL/SQLスクリプトを書いた:Oracle 10g PL/SQLでシーケンスのMINVALUEを取得するにはどうすればよいですか?

:シーケンスのMINVALUEが最大の主キーよりも大きい場合しかし、私はエラーを取得する

DECLARE 
    max_idn NUMERIC(18, 0); 
    seq_nextval NUMERIC(18, 0); 
    increment_amount NUMERIC(18, 0); 
BEGIN 
    SELECT MAX(mbr_idn) 
    INTO max_idn 
    FROM mbr; 

    SELECT mbr_seq.nextval 
    INTO seq_nextval 
    FROM DUAL; 

    increment_amount := max_idn - seq_nextval; 

    EXECUTE IMMEDIATE 
    'ALTER SEQUENCE mbr_seq 
    increment by ' || increment_amount; 
END; 

ORA-08004:順序MBR_SEQ.NEXTVALはMINVALUEを下回るとインスタンス化することはできません

ORA-06512:行で10

"increment_amountでシーケンスをインクリメントするが、MINVALUEより下にはならない"と言うのが一番簡単な方法は何ですか?

+1

のErm、あなたのコードの中にそれを組み込むことができるMIN_VALUE

SELECT min_value INTO l_min_value FROM all_sequences WHERE sequence_name = 'MBR_SEQ' AND owner = <<sequence owner>> 

を取得するためにDBA_SEQUENCESテーブルを照会することができますテーブルの列からの最大値?そうでない場合は、シーケンスを変更するようにスクリプトを変更することをお勧めします。 –

+1

もう1つは、NEXTVALを1回選択した後にINCREMENT BYをリセットすることです。 – APC

答えて

3

あなたの現在のシーケンス値がより高くなっているいずれかの可能性がある、あなたはその後、すなわち

increment_amount := GREATEST(max_idn, l_min_value) - seq_nextval; 
+0

これを行う他の方法はありますか?残念ながら、使用しているユーザーがdba_sequencesビューにアクセスするとは思いません。 –

+3

ユーザーがシーケンスを使用できる(つまり、SELECT権限を持っている)場合、ALL_SEQUENCESビューに表示されます。 – dpbradley

+0

@dpbradley - 良い点。代わりにALL_SEQUENCESを使用するようにコードを修正しました。 –

関連する問題