Oracle 序列生成器中的保留号

如何解决Oracle 序列生成器中的保留号

我们要求在使用 Oracle Sequence Generator 生成新数字时跳过几个定义的数字。

例如:- 我们定义了从 0001-9999 的范围,但在此范围内,Oracle 定序器永远不会生成数字 0011、0020、2056、6547。

可以吗?

解决方法

可以吗?

有点……只是在 2057 处开始序列并在 6546 处停止,那么您将永远不会生成任何这些值。

如果您想从 1 开始一直到 9999 跳过这些值,那么,不,Oracle 序列中没有任何内容允许您这样做。

,

你不能完全在内置的序列机制中做到这一点。作为一种解决方法,您可以有一个包装函数来跳过禁止的值,例如:

CREATE FUNCTION get_seq RETURN NUMBER IS
  seq_val PLS_INTEGER := 11; -- any banned value
BEGIN
  WHILE seq_val IN (11,20,2056,6547) LOOP
    seq_val := my_seq.nextval;
  END LOOP;
  RETURN seq_val;
END;
/

然后调用 get_seq 代替 my_seq.nextval

db<>fiddle demp 具有较小的范围,显示它跳过值。

当然也有缺点;您可能会看到上下文切换对性能的显着影响,尽管在如此小的范围内,您可能不会非常强烈地调用它。如果您的禁止数字发生变化,您必须更改函数,或者让函数从其他地方查找它们 - 如果您要避免现有的 PK 值,您可能需要或想要这样做。必须参考不同的东西来检索 nextval(间接通过函数)和 currval(直接从序列中)可能会令人困惑。等等。但这是一个选择...

如果您要避免使用现有的 PK 值,那么另一种选择是坚持一个简单的序列并插入一个循环,该循环在您没有遇到约束错误时退出 - 即通常在一次迭代之后。但目前尚不清楚您真正想要达到的目标。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?