我有大约 10 个表,我使用 select 和 join 语句从中选择。我让 select 语句正常工作,但想生成更多数据以确保它确实有效。
有没有一种简单的方法来生成虚拟数据而无需手动操作。也就是说,如果从表 a 中选择连接表 b a.id = b.id
。如何在不手动执行的情况下生成满足此要求的数据?如果这没有意义,我可以更清楚地说明。谢谢!!
我有大约 10 个表,我使用 select 和 join 语句从中选择。我让 select 语句正常工作,但想生成更多数据以确保它确实有效。
有没有一种简单的方法来生成虚拟数据而无需手动操作。也就是说,如果从表 a 中选择连接表 b a.id = b.id
。如何在不手动执行的情况下生成满足此要求的数据?如果这没有意义,我可以更清楚地说明。谢谢!!
对于相关表(您需要连接和参照完整性才能工作..),您必须一个接一个地编写一个 pl/sql 块或一组插入。
PL/SQL : --见下文以了解如何生成多行...
Begin
for v_rec in (select level from dual
connect by level <= 1000)
loop
create_new_dept (v_rec.level);
create_1000_rows_for_dept(v_rec.level);
end loop;
end;
/
或 SQL:
--create 1000 departments.
insert into dept(deptno, dname)
select level, 'deptno ' || level
from dual
connect by level <= 1000;
commit;
--create 1000 employees for each department..
with emp as
(select level empid
from dual
connect by level <=1000
)
insert into emp(empno, deptno, dname)
select deptno,
emp_seq.nextval,
'dname ' || 'emp ' || level empname
from dept,
emp; --no join condition, cartesian join on purpose
commit;
当表格彼此不相关时,有两种常见的方法。
使用 DBMS_RANDOM,通过查询连接并生成多行。例子...
--This will insert 1000 rows {(1, emp1), (2,emp2)} and so on..
insert into emp (empno, ename)
select level, 'employee ' || level
from emp
connect by level <=1000;
使用 dba_objects 之类的表并执行多次插入以生成数据。如果您想测试“基于函数的索引的性能”之类的案例并且并不真正关心它是什么数据,只要有很多数据,这很有用。
create table my_test_table
as
select * from dba_objects; --or user_objects, all_objects
--keep doubling rows until you have enough rows.
insert into my_test_table
select * from my_test_table;
commit;
使用 LEVEL 插入 10 行的简单示例 - 运行内部查询以查看结果:
INSERT INTO emp_test(empno)
(
SELECT 1+LEVEL-1 FROM dual
CONNECT BY LEVEL <= 10
)
/