使用相同seed的Oracle dbms_random能否生成不同随机记录集?
Oracle dbms_random包相关问题解答
1. initialize方法与seed方法的区别
dbms_random.initialize是Oracle已经废弃的旧方法,仅为向下兼容保留,从11gR2开始官方就不推荐使用,后续版本可能被移除,仅支持整数类型的种子入参。dbms_random.seed是官方推荐的替代方法,支持整数、最长2000位的字符串两类种子入参,适配场景更广泛。
针对你需要固定seed得到稳定抽样结果的需求,你目前使用dbms_random.seed(固定值)的写法完全符合要求:只要seed值不变,dbms_random.value生成的随机序列就固定,排序后取前20条的结果就不会变化,不需要用已经废弃的initialize方法。
2. 保留原有seed生成不同随机记录集的方案
可以实现,不需要修改你原本的seed值,有两种常用方案:
方案1:调整排序逻辑
不需要重新设置seed,仅修改ORDER BY后的随机值计算逻辑即可,比如叠加固定偏移量、给value方法传入不同的上下限参数:
begin -- 依旧使用原有seed 100 dbms_random.seed(100); SELECT * FROM ( SELECT * FROM your_table -- 叠加固定偏移量即可得到不同的排序结果,要复原第一组结果时去掉偏移量即可 ORDER BY DBMS_RANDOM.value + 1000) WHERE rownum < 21; end;
方案2:重置随机序列起始点
你可以随时重新调用dbms_random.seed(原有seed值)来把随机序列重置到初始位置,之后不管怎么调整生成逻辑,只要后续再调用一次相同的seed设置,就能复原第一组抽样结果,完全不会破坏原有seed对应的结果。
注:你提供的示例代码存在PL/SQL语法问题:PL/SQL块中不能直接执行不带INTO子句的SELECT语句,实际使用时需要加INTO赋值给变量,或者用游标、动态SQL输出结果。
内容的提问来源于stack exchange,提问作者user1205746
相关产品推荐
相关产品推荐

