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

我曾尝试noorder 在oracle SQL中使用该子句,但仍然按升序获取生成的序列。

下面是序列创建脚本

create sequence otp_seq 

minvalue 100000 maxvalue 999999

increment by 1 nocycle noorder;

当我反复运行以下命令时:

select otp_seq.nextval from dual;

它仅按顺序给出值:

100000

100001

100002

我想要的是从给定域(即minValue和maxValue之间)随机生成的值,并且 应该是唯一的

回答:

关于该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 number

is

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

989896

SQL> select * from pseudo_sequence where used='Y'

2 /

U ID NEXT_VAL

- ---------- ----------

Y 1 216000

Y 2 625803

Y 3 806843

Y 4 997165

Y 5 989896

SQL> select random_nextval from dual

2 connect by level <= 5

3 /

RANDOM_NEXTVAL

--------------

346547

911900

392290

712611

760088

SQL>

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

以上是 在Oracle中生成6位唯一随机数生成器序列 的全部内容, 来源链接: utcz.com/qa/401324.html

回到顶部