sql - 为什么 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
.
解决方案
您的评论“......我想避免并发问题”让我思考。
为什么不尝试插入一个随机数,注意重复违规,然后重试直到成功?即使是查找可用号码的非常聪明的解决方案也可能在两个单独的会话中提供相同的新号码。因此,只有插入并提交的预留编号是安全的。
推荐阅读
- r - Finstr get_xbrl_statement 解析提取的 XBRL 实例文档时出错
- python-3.x - 了解如何使用 CORS 获取云函数
- audio - 蓝牙低功耗语音功能选项
- awk - 用awk提取多个字符串
- ssl - 是否有推荐的方式来建立与握手过程超时的对等方的 SSLSocket 连接
- assembly - x64 程序集段错误 rbx 与 rcx
- r - 使用 R 创建数字和字母的顺序列表
- c# - 将 Dictionary(ExpandoObject) 转换为 DataTable
- powerbi - 如何显示由每个实例的间隔和时间定义的运行总时间
- javascript - Typescript 构建依赖于目标