如何修改Oracle SQL语句生成大量随机数据插入BLOB列?
解决方案
方案1:生成固定内容的大RAW数据
如果不需要随机内容,直接生成重复的固定字节(比如全0x01),用RPAD配合UTL_RAW.CAST_TO_RAW可以快速生成指定长度的RAW数据。示例中生成1KB(1024字节)的内容:
INSERT INTO a.b(DATA, ID, ORDER_ID) SELECT UTL_RAW.CAST_TO_RAW(RPAD('1', 1024, '1')), -- 生成1024字节的重复'1'并转成RAW RAW_TO_GUID(SYS_GUID()), level FROM dual CONNECT BY level <= 100000 AND PRIOR SYS_GUID() IS NOT NULL; -- 避免Oracle递归优化,确保生成10万行
可调整RPAD的第二个参数改变DATA字段大小,比如4096对应4KB,按需设置即可。
方案2:生成随机大RAW数据
如果需要随机内容的大字段,用Oracle自带的UTL_RANDOM.RAW函数直接生成指定长度的随机RAW数据,效率很高:
INSERT INTO a.b(DATA, ID, ORDER_ID) SELECT UTL_RANDOM.RAW(1024), -- 生成1024字节的随机RAW数据 RAW_TO_GUID(SYS_GUID()), level FROM dual CONNECT BY level <= 100000 AND PRIOR DBMS_RANDOM.VALUE() IS NOT NULL; -- 防止递归优化
UTL_RANDOM.RAW的参数最大支持32767,足够覆盖大部分调试场景的大字段需求。
方案3:生成Base64编码后转RAW(可选)
如果需要模拟Base64相关处理逻辑,可以先生成随机RAW再转Base64字符串,最后转回RAW:
INSERT INTO a.b(DATA, ID, ORDER_ID) SELECT UTL_ENCODE.BASE64_DECODE(UTL_RAW.CAST_TO_RAW(UTL_ENCODE.BASE64_ENCODE(UTL_RANDOM.RAW(1024)))), RAW_TO_GUID(SYS_GUID()), level FROM dual CONNECT BY level <= 100000 AND PRIOR SYS_GUID() IS NOT NULL;
注意事项
- 生成10万行时,
CONNECT BY后必须加PRIOR [随机函数] IS NOT NULL,否则Oracle会因递归优化只生成一行数据。 - 如果
DATA字段类型是BLOB,可改用UTL_RAW.CAST_TO_BLOB转换,比如UTL_RAW.CAST_TO_BLOB(UTL_RANDOM.RAW(1024))。
内容的提问来源于stack exchange,提问作者Martin Mucha
相关产品推荐
相关产品推荐

