oracle - 如何在 Oracle 10g PL/SQL 中获取序列的 MINVALUE?

标签 oracle plsql oracle10g aggregate-functions sequences

我编写了一个 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: sequence MBR_SEQ.NEXTVAL goes below MINVALUE and cannot be instantiated

ORA-06512: at line 10


说“按 increment_amount 增加序列,但不要低于 MINVALUE”的最简单方法是什么?

最佳答案

您可以查询 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;

关于oracle - 如何在 Oracle 10g PL/SQL 中获取序列的 MINVALUE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1374502/

相关文章:

sql-server - 如何将数据从 SQL Server 数据库传输到 Oracle 数据库

java - 将存储过程 PL/SQL 转换为 Java

Java 存储过程在 Oracle 数据库中不返回任何内容

sql - Oracle PL/SQL 字符串格式化

c# - OracleBulkCopyOptions.Default 和 OracleBulkCopyOptions.UseInternalTransaction 之间的区别。

oracle - ORA-01461 : can bind a LONG value only for insert into a LONG column-Occurs when querying

oracle - 如何在打开游标之前在存储过程中创建临时表?

database - 如何从oracle中的一个作业中调用两个程序?

sql - 获取两个表中几列的总和

database - 在 PLSQL 中,如何迭代更新一个非常大的表的字段?