Как получить МИНИМАЛЬНОЕ ЗНАЧЕНИЕ последовательности в Oracle 10g PL/SQL?

Я написал сценарий 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;

Однако я получаю сообщение об ошибке, если МИНИМАЛЬНОЕ ЗНАЧЕНИЕ последовательности больше, чем максимальный первичный ключ:

ORA-08004: последовательность MBR_SEQ.NEXTVAL ниже MINVALUE и не может быть создана

ORA-06512: в строке 10

Как проще всего увеличить последовательность на increment_amount, но не опускаться ниже MINVALUE?


person Jason Baker    schedule 03.09.2009    source источник
comment
Эээ, есть ли шанс, что текущее значение последовательности выше, чем максимальное значение из столбца таблицы? Возможно, вы захотите изменить сценарий, чтобы изменить только последовательность, если это не так.   -  person Juergen Hartelt    schedule 03.09.2009
comment
Во-вторых, не забудьте сбросить INCREMENT BY после однократного выбора NEXTVAL.   -  person APC    schedule 04.09.2009


Ответы (1)


Вы можете запросить таблицу 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;
person Justin Cave    schedule 03.09.2009
comment
Есть ли другие способы сделать это? К сожалению, я не думаю, что у используемого нами пользователя есть доступ к представлению dba_sequences. - person Jason Baker; 03.09.2009
comment
если пользователь может использовать (т. е. имеет привилегии SELECT) последовательность, она появится в представлении ALL_SEQUENCES. - person dpbradley; 03.09.2009
comment
@dpbradley - Хороший вопрос. Изменен код для использования вместо него ALL_SEQUENCES. - person Justin Cave; 03.09.2009