首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成随机ROWID

生成随机ROWID
EN

Stack Overflow用户
提问于 2015-06-09 08:50:39
回答 3查看 2.4K关注 0票数 0

我试图为测试目的创建一个随机的ROWID。我知道这不是正确的方法,但由于我没有数据(但),所以每次插入ROWID的“值”(使用ROWIDTOCHAR函数)时都需要保证,所以每次都有不同的字符串。

我从Oracle中读取了ROWID,并找到了一种使用ROWID_CREATE函数为测试目的生成ROWID的方法。

代码语言:javascript
复制
DBMS_ROWID.ROWID_CREATE (
   rowid_type    IN NUMBER, 
   object_number IN NUMBER,
   relative_fno  IN NUMBER,
   block_number  IN NUMBER,
   row_number    IN NUMBER) 
  RETURN ROWID;

我的问题是:是否有一种方法可以使用这个函数实例化随机ROWID?(就像一个随机函数来生成IN参数)

相应地,我在随机性页面中所读到的内容

  • DBMS_RANDOM.RANDOM在[-2^^31,2^^31]中生成整数。
  • DBMS_RANDOM.VALUE在[0,1]中生成数字,精度为38位。

我不确定生成的值是否总是有效的,以成为IN参数并生成ROWID。我只需要一个有效的ROWID,这样我就可以使用ROWIDTOCHAR函数

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-09 10:13:16

与其生成自己的随机值(该值可能指向或不指向实际对象(但可能不是),还可以从实表中获得随机行的真实ROWID。如果您没有自己的数据,您可以使用可以看到的任何表;在all_tables中查找最高的num_rows值。

例如,如果您有私密性可以直接查询,您可以使用SYS.OBJ$

代码语言:javascript
复制
select rowidtochar(min(rowid)) from SYS.OBJ$ sample(0.001);

调整样本大小,使您始终得到一些数据,但尽可能少;您仍然会得到多行返回,因此min()会选择一个。当然,并不保证每次都能得到不同的值,但dbms_random也不一定,对于足够大的表,它应该足够好。

如果您无法访问适当大的表,则可以生成随机值,如您所述:

代码语言:javascript
复制
select rowidtochar(dbms_rowid.rowid_create(
   rowid_type => 1, 
   object_number => ceil(dbms_random.value(0, 1023)),
   relative_fno => ceil(dbms_random.value(0, 1023)),
   block_number => ceil(dbms_random.value(0, 1023)),
   row_number => ceil(dbms_random.value(0, 1023))))
from dual;

对于每个整数值,这是使用重载的dbms_random.value函数在一个范围内获得一个值,然后使用ceil使其成为整数。(您也可以使用trunc,或圆形,或者强制转换;零可能不是有效的参数,因此您可能需要值范围从1开始,而不是从这些值开始)。

正如David所说,这些参数中的一些将受到限制(您可能可以从文档中推断出这些参数,但这些参数还没有得到验证);并且反复运行会给出不同的值:

代码语言:javascript
复制
ROWIDTOCHAR(DBMS_R
------------------
AAAAODADcAAAAOfABa
AAAAHTADOAAAANaAEb
AAAAI+ANtAAAAMuAKl
AAAAOdAI2AAAAMiAJ4
AAAADNAFAAAAAJRAIn
票数 2
EN

Stack Overflow用户

发布于 2015-06-09 08:58:07

我认为这个函数非常愚蠢,因为它不会检查某个特定的对象号是否存在,作为生成ROWID的一部分。然而,对于rowid_type来说,情况可能并非如此。

当然,许多数字都有一个上限,但是您可以从解释格式的行ID文档中推断出这些数字。

票数 1
EN

Stack Overflow用户

发布于 2015-06-09 08:59:50

我认为这更适合DBA。例如,当您面临数据文件损坏的问题时。dbv或语句alter database dump block或各种数据库崩溃转储之类的工具包含数据库块地址和传递给此函数的其他数字。因此,这可以用于识别数据库中的特定数据。

此函数不检查产生的数字是否确实是特定数据段中的有效行地址。

如果您希望看到一些随机表数据,请使用样本条款:

代码语言:javascript
复制
select * from t sample(5);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30727236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档