如何解决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 举报,一经查实,本站将立刻删除。