不使用FOR LOOP如何批量插入100万条dummy测试记录?
Oracle 无FOR循环批量插入百万条测试数据实现方案
现有循环方案(当前使用写法)
CREATE TABLE dummy_records ( dummy_id number not null, dummy_name varchar2(100) ); BEGIN FOR loop_counter IN 1..1000000 LOOP INSERT INTO dummy_records (dummy_id, dummy_name) VALUES (loop_counter, dbms_random.value(1,100)); END LOOP; END; /
无循环替代方案
方案1:CONNECT BY层级查询(推荐,兼容性高、性能最优)
单条INSERT即可完成批量写入,无需显式编写循环逻辑,执行效率远高于逐行插入的循环写法:
-- 建表语句同上 CREATE TABLE dummy_records ( dummy_id number not null, dummy_name varchar2(100) ); -- 一次性插入100万条测试数据 INSERT INTO dummy_records (dummy_id, dummy_name) SELECT LEVEL, dbms_random.value(1,100) FROM dual CONNECT BY LEVEL <= 1000000; COMMIT;
说明:LEVEL是Oracle层级查询的内置伪列,会从1开始自动递增到CONNECT BY子句指定的上限,直接生成对应行数的结果集,完成批量插入。
方案2:递归CTE写法
如果习惯用通用表达式实现,也可以用递归CTE生成序列:
-- 先调整会话递归深度上限,否则默认1000层会报错 ALTER SESSION SET RECURSIVE_CTE_MAX_DEPTH = 1000000; WITH t(n) AS ( SELECT 1 FROM dual UNION ALL SELECT n+1 FROM t WHERE n < 1000000 ) INSERT INTO dummy_records (dummy_id, dummy_name) SELECT n, dbms_random.value(1,100) FROM t; COMMIT;
内容的提问来源于stack exchange,提问作者stocke
相关产品推荐
相关产品推荐

