You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

纯SQL如何让DBMS_RANDOM每次运行生成不同测试数据

解答

你完全不需要编写PL/SQL就能实现每次运行SQL生成不同随机测试数据的需求,核心逻辑说明:

  • 你对随机种子的适用场景存在认知偏差:Oracle的DBMS_RANDOM包原生支持在普通SQL语句中直接调用,不需要包裹在BEGIN/END的PL/SQL块里才能使用。
  • 只要你不主动调用DBMS_RANDOM.SEED(固定数值)手动设置固定随机种子,Oracle会自动基于系统当前时间、会话唯一标识等熵源初始化随机数生成器,每次运行SQL时生成的随机序列完全独立,天然就会输出不同的生成结果,不需要额外模拟随机种子效果。

你提供的原有脚本本身已经具备随机生成姓名的基础能力,只是存在两个可以优化的点,避免概率偏差或者结果不符合预期:

  1. 用ROUND(DBMS_RANDOM.VALUE(1,25))取整会导致1和25两个端点值的出现概率只有其他值的一半,替换为TRUNC(DBMS_RANDOM.VALUE(1,26))可以保证1-25每个整数的抽取概率完全均等。
  2. 原有脚本中active字段是通过MOD(LEVEL,10)固定规则生成的,每10条记录必然出现1条状态为N的数据,如果需要这个字段也随机生成,可以替换为随机判断逻辑。

调整后可直接运行的完整脚本如下:

-- 可选:如果表已存在先删除,避免建表报错,根据自身需求决定是否保留
DROP TABLE students PURGE;

CREATE TABLE students (
   student_id  NUMBER(*,0),
  first_name VARCHAR2(25) NOT NULL,
  last_name VARCHAR2(25) NOT NULL,
  active VARCHAR2(1) DEFAULT 'Y',
CONSTRAINT student_pk PRIMARY KEY (student_id)
);

INSERT INTO students (student_id, first_name, last_name, active)
SELECT
  LEVEL,       
  CASE TRUNC(DBMS_RANDOM.VALUE(1,26)) 
    WHEN 1 THEN 'Faith' 
    WHEN 2 THEN 'Tom' 
    WHEN 3 THEN 'Anna'
    WHEN 4 THEN 'Lisa' 
    WHEN 5 THEN 'Andy' 
    WHEN 6 THEN 'Thomas' 
    WHEN 7 THEN 'Alan'
    WHEN 8 THEN 'Keith' 
    WHEN 9 THEN 'Cheryl' 
    WHEN 10 THEN 'Chester' 
    WHEN 11 THEN 'Steve'
    WHEN 12 THEN 'Mel' 
    WHEN 13 THEN 'Micheal' 
    WHEN 14 THEN 'Ron' 
    WHEN 15 THEN 'Donald'
    WHEN 16 THEN 'Carolyn' 
    WHEN 17 THEN 'Racheal' 
    WHEN 18 THEN 'Debbie' 
    WHEN 19 THEN 'Madison'
    WHEN 20 THEN 'Danny' 
    WHEN 21 THEN 'Claude' 
    WHEN 22 THEN 'Peter' 
    WHEN 23 THEN 'Edna' 
    WHEN 24 THEN 'Anita'
    WHEN 25 THEN 'Mindy' 
  END AS first_name,
  CASE TRUNC(DBMS_RANDOM.VALUE(1,26)) 
    WHEN 1 THEN 'Andrews' 
    WHEN 2 THEN 'Thorton' 
    WHEN 3 THEN 'Smith'
    WHEN 4 THEN 'Jones' 
    WHEN 5 THEN 'Beirs' 
    WHEN 6 THEN 'Stevens' 
    WHEN 7 THEN 'Feldman'
    WHEN 8 THEN 'Stein' 
    WHEN 9 THEN 'Ross' 
    WHEN 10 THEN 'Mednick' 
    WHEN 11 THEN 'Saltzman'
    WHEN 12 THEN 'Kramer'
    WHEN 13 THEN 'Monroe' 
    WHEN 14 THEN 'Hanks' 
    WHEN 15 THEN 'Dunn'
    WHEN 16 THEN 'Dunbar' 
    WHEN 17 THEN 'Rucker' 
    WHEN 18 THEN 'Silverberg' 
    WHEN 19 THEN 'Daniels'
    WHEN 20 THEN 'Kern' 
    WHEN 21 THEN 'Saladino' 
    WHEN 22 THEN 'Rice'
    WHEN 23 THEN 'Sanford' 
    WHEN 24 THEN 'Krantz'
    WHEN 25 THEN 'Roth' 
  END AS last_name, 
  -- 如果需要保留原有每10条出1个N的固定规则,换回MOD(LEVEL,10)的写法即可
  CASE TRUNC(DBMS_RANDOM.VALUE(1,11))
    WHEN 10 THEN 'N'
    ELSE 'Y'
  END AS active
FROM DUAL
CONNECT BY LEVEL <= 25;

COMMIT;

补充排错说明:如果运行时发现随机结果固定重复,检查当前会话是否之前执行过设置固定种子的语句(比如EXEC DBMS_RANDOM.SEED(100)这类),只需要手动执行一次DBMS_RANDOM.SEED(NULL)或者重新建立数据库会话,就能恢复默认的真随机效果,全程不需要编写PL/SQL块。

内容的提问来源于stack exchange,提问作者Pugzly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 18:45:32