4

シーケンスの値をテーブルの主キーの最大値に設定する PL/SQL スクリプトを作成しました。

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;

ただし、シーケンスの MINVALUE が最大主キーより大きい場合、エラーが発生します。

ORA-08004: シーケンスMBR_SEQ.NEXTVALがMINVALUEを下回り、インスタンス化できません

ORA-06512: 10行目

「increment_amount だけシーケンスを増やしますが、MINVALUE を下回らないようにする」と言う最も簡単な方法は何ですか?

4

1 に答える 1

3

DBA_SEQUENCES テーブルをクエリして、MIN_VALUE を取得できます。

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

次に、それをコードに組み込むことができます。

increment_amount := GREATEST( max_idn, l_min_value ) - seq_nextval;
于 2009-09-03T16:40:19.617 に答える