假设:有一个表有如下字段:day(日期),cur_value(当日值),yes_value(昨日值),thisMonth_totalvalue(当月累计值),lastMonth_totalvalue(上月累计值)
其中当日值用trunc(dbms_random.value(1, 100), 2)去除了一个随机数,而其他的值都是直接或间接依赖于当日值,比如
day cur_value yes_value thisMonth_totalvalue lastMonth_totalvalue20070101 11 0 11 0
20070102 12 11 23 0
20070103 23 12 46 0
20070201 13 0 13 11
20070202 64 13 77 23
20070203 45 64 122 46
如果上月记录不存在或昨日记录不存在则显示用nvl()让它显示0;
这样该如何批量的插入记录呢,插几条还可以手动插入,一旦要插入成千上万条记录该如何实现呢。
declare
v_day varchar2(20);
nextDay varchar2(20);
cur_value number;
yes_value number;
i number;
tempDay varchar2(20);
begin
execute immediate 'truncate table dm.DM_KPID_IW_AREA';
v_day := '20070301';
for k in 0 .. 3 loop
tempDay := to_char(add_months(to_date(v_day, 'yyyymmdd'), k),
'yyyymmdd');
i := 0;
for i in 0 .. 3 loop
nextDay := to_char(to_date(tempDay, 'yyyymmdd') + i, 'yyyymmdd');
cur_value := trunc(dbms_random.value(1, 100), 2);
yes_value := cur_value;
insert into dm.DM_KPID_IW_AREA
(day_id, cur_value, yes_value)
values
(nextDay, cur_value, yes_value);
commit;
end loop;
end loop;
end;
上面这个有错误。
其中当日值用trunc(dbms_random.value(1, 100), 2)去除了一个随机数,而其他的值都是直接或间接依赖于当日值,比如
day cur_value yes_value thisMonth_totalvalue lastMonth_totalvalue20070101 11 0 11 0
20070102 12 11 23 0
20070103 23 12 46 0
20070201 13 0 13 11
20070202 64 13 77 23
20070203 45 64 122 46
如果上月记录不存在或昨日记录不存在则显示用nvl()让它显示0;
这样该如何批量的插入记录呢,插几条还可以手动插入,一旦要插入成千上万条记录该如何实现呢。
declare
v_day varchar2(20);
nextDay varchar2(20);
cur_value number;
yes_value number;
i number;
tempDay varchar2(20);
begin
execute immediate 'truncate table dm.DM_KPID_IW_AREA';
v_day := '20070301';
for k in 0 .. 3 loop
tempDay := to_char(add_months(to_date(v_day, 'yyyymmdd'), k),
'yyyymmdd');
i := 0;
for i in 0 .. 3 loop
nextDay := to_char(to_date(tempDay, 'yyyymmdd') + i, 'yyyymmdd');
cur_value := trunc(dbms_random.value(1, 100), 2);
yes_value := cur_value;
insert into dm.DM_KPID_IW_AREA
(day_id, cur_value, yes_value)
values
(nextDay, cur_value, yes_value);
commit;
end loop;
end loop;
end;
上面这个有错误。
其他字段的值可以根据基础数据算出来,用sql语句update一下
sqlldr
是一种方法如果数据前后有依赖,则可以直接在程序中处理。
v_day varchar2(20);
nextday varchar2(20);
cur_value number;
yes_value number;
thismonth_totalvalue number;
lastmonth_totalvalue number;
i number;
tempday varchar2(20);
day_count integer;
begin
execute immediate 'truncate table DM_KPID_IW_AREA';
v_day := '20070101';
-- lastmonth_totalvalue := 0;
for k in 0 .. 11 loop
tempday := to_char(add_months(to_date(v_day,
'yyyymmdd'),
k),
'yyyymmdd');
yes_value := 0;
thismonth_totalvalue := 0;
-- 这里好像有一个比较方便的函数吧,记不清了
day_count := to_char(last_day(to_date(tempday, 'yyyymmdd')), 'dd');
for i in 0 .. day_count - 1 loop
nextday := to_char(to_date(tempday, 'yyyymmdd') + i,
'yyyymmdd');
cur_value := trunc(dbms_random.value(1, 100), 0);
thismonth_totalvalue := thismonth_totalvalue + cur_value;
begin
select t.thismonth_totalvalue
into lastmonth_totalvalue
from dm_kpid_iw_area t
where t.day_id =
--考虑如3月30日之类这样的情况,前一月没有对应的日子的情况,
--如果此时上月值为0的话,则应该为:
--to_char(add_months(to_date(nextday, 'yyyymmdd'), -1),
--'yyyymm') || substr(nextday, 7, 2);
to_char(add_months(to_date(nextday, 'yyyymmdd'), -1),
'yyyymmdd');
exception
when no_data_found then
lastmonth_totalvalue := 0;
end;
insert into dm_kpid_iw_area
(day_id,
cur_value,
yes_value,
thismonth_totalvalue,
lastmonth_totalvalue)
values
(nextday,
cur_value,
yes_value,
thismonth_totalvalue,
lastmonth_totalvalue);
yes_value := cur_value;
commit;
end loop;
end loop;
end;