表T_CAR
属性名称
|
属性代码
|
属性类型
|
属性长度
|
备注
|
CAR_ID
|
CAR_ID
|
VARCHAR2
|
38
|
主键。guid+"-"+5位流水号
|
CAR_DIS
|
CAR_DIS
|
Integer
|
|
顺序号。
|
厂家
|
CJ
|
VARCHAR2
|
20
|
东风、大众、一汽
|
涡轮等级
|
WLDJ
|
Varchar2
|
|
1.2L、2.0L、2.8L
|
台数
|
TS
|
INTEGER
|
|
整数,100以内
|
日期
|
Rq
|
Date
|
|
|
向这个表中增加2000条随机数据。字段属性依照备注的规则生成,日期随机产生。
一开始我想使用一条SQL来完成以上要求,并且建立了两个临时表
temp_wldj:
IDD
|
WLDJ
|
1
|
1.2L
|
2
|
2.0L
|
3
|
2.8L
|
temp_cj:
编写时发现厂家和涡轮等级没法随机取值。
随机取到一条记录:
select *
from (select ds from temp_cj order by dbms_random.value)
where rownum = 1
插入2000条,其中表table_2000是随便一个有2000条记录的一个表,超过2000可以加 where rownum<2001

SQL插入
1
select sys_guid() || '-' || lpad(rownum, 5, '0'),
2
rownum,
3
(select *
4
from (select ds from temp_cj order by dbms_random.value)
5
where rownum = 1),
6
(select *
7
from (select ds from temp_wldj order by dbms_random.value)
8
where rownum = 1),
9
trunc(dbms_random.value(0, 100)),
10
sysdate - dbms_random.value - dbms_random.value(1, 3000)
11
from table_2000 -- where rownum<2001
这样插入时厂家和涡轮等级取值不是随机。
于是我考虑使用了存储过程:

批量插入
1
create or replace procedure p_batchins_ghl(i_sum number) is
2
v_ds varchar(20);
3
v_wldj varchar2(20);
4
v_sql varchar2(1000);
5
v_num number;
6
begin
7
v_num := 1;
8
loop
9
exit when(v_num > i_sum);
10
11
select ds
12
into v_ds
13
from (select ds from temp_cj order by dbms_random.value)
14
where rownum = 1;
15
16
select dydj
17
into v_wldj
18
from (select dydj
19
from temp_wldj
20
order by dbms_random.value)
21
where rownum = 1;
22
23
v_sql := 'insert into t_car (CAR_ID,CAR_DIS,cj,wldj,ts,rq ) ( select ''' ||
24
sys_guid() || '-' || lpad(v_num, 5, '0') || ''' , ''' ||
25
v_num || ''' ,''' || v_ds || ''' ,''' || v_wldj ||
26
''' ,
27
trunc(dbms_random.value(0, 100)), sysdate - dbms_random.value - dbms_random.value(1, 3000) from dual)';
28
execute immediate v_sql;
29
commit;
30
31
v_num := v_num + 1;
32
end loop;
33
end;
测试:oracle10g 服务器:HP-DL380 工具:PL/SQL 用时: 16.182S
其实问题的难点在于随机从固定的范围内取值(厂家、电压等级)。
于是写一个方法完成此难点的需求:
传入取值范围,返回随机一个值。

随机取值方法
1
create or replace function f_random_val_ghl(v_tabName varchar2,v_column varchar2)
2
return varchar2 as
3
v_result varchar2(20);
4
begin
5
execute immediate' select * from (select '||v_column||' from '||v_tabName||' order by dbms_random.value )where rownum=1'
6
into v_result;
7
return v_result;
8
end f_random_val_ghl;
如此一来,使用一条SQL就可以完成我们的任务。

SQL插入(调用方法)
1
select sys_guid() || '-' || lpad(rownum, 5, '0'),
2
rownum,
3
f_random_val_ghl('temp_cj', 'ds'),
4
f_random_val_ghl('temp_wldj', 'dydj'),
5
trunc(dbms_random.value(0, 100)),
6
sysdate - dbms_random.value - dbms_random.value(1, 3000)
7
from table_2000 -- where rownum<2001
测试:oracle10g 服务器:HP-DL380 工具:PL/SQL 用时: 0.844S
应该还可以不需要建立两个临时表,直接把取值范围出入一个function返回随机一个值。
另外,在测试中发现如下两个 SQL:

疑问
SELECT ds
FROM temp_cj d where d.idd=ceil(3*dbms_random.value) ;
SELECT ds
FROM temp_cj d where d.idd=trunc(dbms_random.value(1, 4));
结果集的数目是随机的,就是有时返回空,有时返回1条或者多条。
function和这个问题有待进一步解决,先写到这里。
PS:如果列位有更好的完成者一任务的方法与思路,请求分享。不正之处望不吝指教!
posted on 2010-03-23 13:42
leja 阅读(1723)
评论(0) 编辑 收藏