在Oracle中生成6位唯一随机数生成器序列

在Oracle中生成6位唯一随机数生成器序列,第1张

在Oracle中生成6位唯一随机数生成器序列

关于该

NOORDER
条款,文档说:

“指定

NOORDER
是否不想保证按请求顺序生成序列号。”

关键词是 保证

NOORDER
不保证随机性,这意味着
NEXTVAL
可能会产生乱序的数字。在每个节点都有序列号缓存的RAC环境中,这是主要要考虑的问题。在这些情况下,
NOORDER
意味着我们无法
NEXTVAL
从给定值的序列中推断出请求的序列,即,我们无法使用这些数字按创建顺序对记录进行排序。

根据您的要求。

您的要求是矛盾的。随机性意味着不可预测性。唯一性意味着可预测性。

您不能按顺序实现此功能,但可以构建自己的东西,如下所示:

create table pseudo_sequence (    used varchar2(1) default 'N' not null    , id number not null    , next_val number not null    , primary key (used, id)    )organization index/

请注意“仅索引表”语法。下一个技巧是随机填充表格。

insert into pseudo_sequence (id, next_val)with nbr as (    select level + 99999 as nx    from dual    connect by level <= 900000    order by dbms_random.value  )select rownum, nx from nbr/

我们需要ID列来保留NEXT_VAL在表中的随机分布。没有索引,索引将强加一个顺序,我们希望避免每次执行查询时都进行排序。

接下来,我们构建一个查询以从表中获取下一个值,并将其标记为已使用:

create or replace function random_nextval    return numberis    pragma autonomous_transaction;    cursor ps is        select next_val         from pseudo_sequence        where used = 'N'        and rownum = 1        for update of used skip locked;    return_value number;begin   open ps;   fetch ps into return_value;   update pseudo_sequence   set used = 'Y'   where current of ps;   close ps;   commit;  return return_value;end;/

这是它的工作方式:

SQL> select random_nextval from dual  2  connect by level <= 5  3  /RANDOM_NEXTVAL--------------        216000        625803        806843        997165        989896SQL> select * from pseudo_sequence where used='Y'  2  /U         ID   NEXT_VAL- ---------- ----------Y          1     216000Y          2     625803Y          3     806843Y          4     997165Y          5     989896SQL> select random_nextval from dual  2  connect by level <= 5  3  /RANDOM_NEXTVAL--------------        346547        911900        392290        712611        760088SQL>

当然,我们可以说这不是随机的,因为通过查看基础表可以预测下一个值,但这也许足以满足您的需求。我不会对多用户环境中的可伸缩性做出任何保证,但是考虑到您的数字空间只有900,000个值,我认为这并不是一个主要问题。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5003802.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-14
下一篇 2022-11-14

发表评论

登录后才能评论

评论列表(0条)

保存