首页 > 解决方案 > 为什么 dbms_random.value 在图形查询(连接方式)中返回相同的值?

问题描述

在 Oracle 11.2.0.4.0 上,当我运行以下查询时,每一行都会得到不同的结果:

select r.n from (
  select trunc(dbms_random.value(1, 100)) n from dual
) r
connect by level < 100; -- returns random values

但是,一旦我在连接或子查询中使用获得的随机值,那么每一行都会从以下位置获得相同的值dbms_random.value

select r.n, (select r.n from dual) from (
  select trunc(dbms_random.value(1, 100)) n from dual
) r
connect by level < 100; -- returns the same value each time

是否可以让第二个查询为每一行返回随机值?

更新

我的例子可能过于简单,这就是我想要做的:

with reservations(val) as (
  select 1 from dual union all
  select 3 from dual union all
  select 4 from dual union all
  select 5 from dual union all
  select 8 from dual
)
select * from (
  select rnd.val, CONNECT_BY_ISLEAF leaf from (
    select trunc(dbms_random.value(1, 10)) val from dual
  ) rnd
  left outer join reservations res on res.val = rnd.val
  connect by res.val is not null
)
where leaf = 1;

但是保留可以从 1 到 1.000.000.000(甚至更多)。有时该查询会正确返回(如果它立即选择了一个没有保留的随机值)或给出内存不足错误,因为它总是尝试使用相同的dbms_random.value.

标签: sqloraclerandom

解决方案


您的评论“......我想避免并发问题”让我思考。

为什么不尝试插入一个随机数,注意重复违规,然后重试直到成功?即使是查找可用号码的非常聪明的解决方案也可能在两个单独的会话中提供相同的新号码。因此,只有插入并提交的预留编号是安全的。


推荐阅读