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 回答