2013-02-05 71 views
1

我有大約10個表,我從select和join語句中選擇。我得到了select語句的工作,但想要生成更多的數據以確保它真的有效。Oracle生成插入語句

是否有一種簡單的方法來生成虛擬數據而無需手動執行。那就是如果從表中選擇a.id = b.id上的連接表b。我怎樣才能生成滿足這個要求的數據,而無需手動執行?如果這沒有意義,我可以更清楚地說明。謝謝!!

+0

是的,使它更清楚。您可以使用DBMS_RANDOM或使用LEVEL/ROWNUM生成行,這涉及到手動編寫查詢的工作。 – Art

+0

確定這裏是和示例查詢。從person.classId = class.id中的人員加入類中選擇姓名,姓氏,Dob;現在,我得到這個查詢返回數據的唯一方法是如果person.classId在類表中,並有ids匹配。我希望生成插入語句,類似insert(person,lastName,Dob,classId)values('test','temp','remove',sysdate,44),並在類表中插入類(id)值(44)。因此,類ID爲44的人將在查詢中返回。這只是一個例子,我真正的表格大約有10列,其中包含大約10個表格 – Mohamed

+0

要真正幫助您更詳細地描述您的問題/數據庫,那將是十分必要的。 一般認爲使用DBOSS_RANDOM或INSERT語句和子選擇,使用CROSS JOINS。 – Viehzeug

回答

0

簡單的例子使用LEVEL插入10行 - 運行內部查詢看到的結果:

INSERT INTO emp_test(empno) 
(
SELECT 1+LEVEL-1 FROM dual 
    CONNECT BY LEVEL <= 10 
) 
/ 
0

相關表(你需要連接和參照完整性的工作。)你必須寫一個pl/sql塊或一組插入。

PL/SQL:--see下面來看看如何生成多行...

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;