表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插入
1select 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
这样插入时厂家和涡轮等级取值不是随机。
于是我考虑使用了存储过程:
批量插入
1create 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;
6begin
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;
33end;
测试:oracle10g 服务器:HP-DL380 工具:PL/SQL 用时: 16.182S
其实问题的难点在于随机从固定的范围内取值(厂家、电压等级)。
于是写一个方法完成此难点的需求:
传入取值范围,返回随机一个值。
随机取值方法
1create or replace function f_random_val_ghl(v_tabName varchar2,v_column varchar2)
2 return varchar2 as
3 v_result varchar2(20);
4begin
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;
8end f_random_val_ghl;
如此一来,使用一条SQL就可以完成我们的任务。
SQL插入(调用方法)
1select 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 阅读(1703)
评论(0) 编辑 收藏