假设:有一个表有如下字段: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;
上面这个有错误。

解决方案 »

  1.   

    将数据写到文件, 再用用sqlldr 做吧
      

  2.   

    先insert基础数据day       cur_value;
    其他字段的值可以根据基础数据算出来,用sql语句update一下
      

  3.   

    建议将数据做成ACCESS,再和ORACLE建立连接,写SQL导入.加快速度!
      

  4.   

    整理完数据之后
    sqlldr
    是一种方法如果数据前后有依赖,则可以直接在程序中处理。
      

  5.   

    create or replace procedure p_test is
        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;