Oracle 生成随机ROWID
我正在尝试创建一个随机ROWID用于测试目的。我知道这不是解决问题的办法,但由于我(目前)没有数据,我只需要保证在插入ROWID的“值”(使用Oracle 生成随机ROWID,oracle,random,plsql,rowid,Oracle,Random,Plsql,Rowid,我正在尝试创建一个随机ROWID用于测试目的。我知道这不是解决问题的办法,但由于我(目前)没有数据,我只需要保证在插入ROWID的“值”(使用ROWIDTOCHAR函数)时,每次都有不同的字符串 我一直在阅读Oracle文档,我发现了一种使用ROWID\u CREATE函数生成ROWID以进行测试的方法 DBMS_ROWID.ROWID_CREATE ( rowid_type IN NUMBER, object_number IN NUMBER, relative_fn
ROWIDTOCHAR
函数)时,每次都有不同的字符串
我一直在阅读Oracle文档,我发现了一种使用ROWID\u 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.RANDOM在[-2^^31,2^^31)中生成整数
- DBMS_RANDOM.VALUE生成[0,1]中的数字,精度为38位
我不确定生成的值是否总是有效的,以便在参数中生成ROWID。我只需要一个有效的ROWID,这样我就可以使用
ROWIDTOCHAR
函数,我认为该函数相当愚蠢,因为它不会在生成ROWID的过程中检查特定的对象号是否存在。相同的mig但是,对于rowid_类型,这可能不是真的
当然,许多数字都会有一个上限,但您可以从解释格式的行ID文档中推断出来。我认为该函数相当愚蠢,因为它不会在生成行ID的过程中检查特定的对象编号是否存在。对于r不过我不喜欢你的类型
当然,许多数字都会有一个上限,但您可以从解释格式的行ID文档中推断出来。我认为该函数相当愚蠢,因为它不会在生成行ID的过程中检查特定的对象编号是否存在。对于r不过我不喜欢你的类型
当然,许多数字都会有一个上限,但您可以从解释格式的行ID文档中推断出来。我认为该函数相当愚蠢,因为它不会在生成行ID的过程中检查特定的对象编号是否存在。对于r不过我不喜欢你的类型
当然,许多数字都有上限,但您可以从解释格式的行ID文档中推断出来。我认为这更适合DBA。例如,当您面临数据文件损坏问题时。
dbv
或语句alter database dump block
或各种database崩溃转储包含数据库块地址和要传递给此函数的其他数字。因此,这可以用于发现数据库中的特定数据
此函数不检查生成的数字是否真的是特定数据段中的有效行
如果您想查看一些随机表数据,请使用
我认为这更适合DBA。例如,当您面临数据文件损坏问题时。类似于
dbv
或statementalter database dump block
或各种数据库崩溃转储的工具包含数据库块地址和要传递给此函数的其他数字。因此,这可以用来发现databa中的特定数据嗯
此函数不检查生成的数字是否真的是特定数据段中的有效行
如果您想查看一些随机表数据,请使用
我认为这更适合DBA。例如,当您面临数据文件损坏问题时。类似于
dbv
或statementalter database dump block
或各种数据库崩溃转储的工具包含数据库块地址和要传递给此函数的其他数字。因此,这可以用来发现databa中的特定数据嗯
此函数不检查生成的数字是否真的是特定数据段中的有效行
如果您想查看一些随机表数据,请使用
我认为这更适合DBA。例如,当您面临数据文件损坏问题时。类似于
dbv
或statementalter database dump block
或各种数据库崩溃转储的工具包含数据库块地址和要传递给此函数的其他数字。因此,这可以用来发现databa中的特定数据嗯
此函数不检查生成的数字是否真的是特定数据段中的有效行
如果您想查看一些随机表数据,请使用
您可以从实际表中获取随机行的实际ROWID,而不是生成自己的随机值(可能指向或不指向实际对象,但可能不是)。如果您没有自己的数据,则可以使用可以看到的任何表;查看
所有表
,以获取最高的num_rows
值
例如,如果您有权直接查询,可以使用SYS.OBJ$
:
select rowidtochar(min(rowid)) from SYS.OBJ$ sample(0.001);
调整样本大小,使您始终获得一些数据,但尽可能少;您仍然会返回多行,因此min()
会选择一行。当然,不能保证每次都获得不同的值,但dbms\u 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
将其设置为整数。(也可以使用trunc、round或cast;尽管零可能不是有效参数,因此可能需要将值范围从一开始,而不是从一开始)
正如David Aldridge所说,这些论点中的一些是有限度的(你可以从理论中推断出来,但它们在tha之外没有得到验证)
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;
ROWIDTOCHAR(DBMS_R
------------------
AAAAODADcAAAAOfABa
AAAAHTADOAAAANaAEb
AAAAI+ANtAAAAMuAKl
AAAAOdAI2AAAAMiAJ4
AAAADNAFAAAAAJRAIn