生成随机ROWID

时间:2015-06-09 08:50:40

标签: oracle random plsql rowid

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

我一直在阅读Oracle文档中的DBMS_ROWID,我找到了一种使用ROWID_CREATE函数为测试目的生成ROWID的方法。

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页面中读到的内容

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

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

3 个答案:

答案 0 :(得分:2)

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

举个例子,你可以使用SYS.OBJ$,如果你有权利直接查询:

select rowidtochar(min(rowid)) from SYS.OBJ$ sample(0.001);

调整样本大小,以便始终获得一些数据,但尽可能少;你还会得到多行,所以min()会选择一行。它不能保证每次都会得到不同的值,但是dbms_random也没有,并且有足够大的表格它应该足够好。

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

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使其成为整数。 (你也可以截断,舍入或转换;但是零可能不是一个有效的参数,所以你可能需要从一个值开始而不是那些值。)

正如大卫·阿尔德里奇所说,其中一些论点会受到限制(你可以从documentation推断出这些论点,但除此之外它们没有得到验证;并且反复运行会给出不同的值:< / p>

ROWIDTOCHAR(DBMS_R
------------------
AAAAODADcAAAAOfABa
AAAAHTADOAAAANaAEb
AAAAI+ANtAAAAMuAKl
AAAAOdAI2AAAAMiAJ4
AAAADNAFAAAAAJRAIn

答案 1 :(得分:1)

我认为该函数非常愚蠢,因为它不会检查特定对象编号是否存在于生成ROWID的一部分。但对于rowid_type,情况可能并非如此。

当然,许多数字都会有上限,但您可以从ROW ID文档中推断出那些解释格式的数据。

答案 2 :(得分:0)

我认为这更适合DBA。例如,当您遇到数据文件损坏问题时。诸如dbv或语句alter database dump block之类的工具或各种数据库故障转储包含数据库块地址以及要传递给此函数的其他数字。所以这可以用来发现数据库中的特定数据。

此函数不会检查结果数字是否确实在特定数据段中添加了有效行。

如果您想查看一些随机表数据,请使用sample clause:

select * from t sample(5);