表:tb_jsgs
-- Create table
create table TB_JSGS
(
  ID     NUMBER(1),
  MC     VARCHAR2(100),
  SL     NUMBER(5),
  BZ_MIN NUMBER(2),
  BZ_MAX NUMBER(2)
);
-- Add comments to the columns 
comment on column TB_JSGS.MC
  is '名称';
comment on column TB_JSGS.SL
  is '数量';
comment on column TB_JSGS.BZ_MIN
  is '比重(最小)';
comment on column TB_JSGS.BZ_MAX
  is '比重(最大)';insert into tb_jsgs (ID, MC, SL, BZ_MIN, BZ_MAX)
values (1, '名称1', 20, 1, 10);
insert into tb_jsgs (ID, MC, SL, BZ_MIN, BZ_MAX)
values (2, '名称2', 25, 2, 9);
insert into tb_jsgs (ID, MC, SL, BZ_MIN, BZ_MAX)
values (3, '名称3', 30, 1, 9);
insert into tb_jsgs (ID, MC, SL, BZ_MIN, BZ_MAX)
values (4, '名称4', 15, 4, 7);
insert into tb_jsgs (ID, MC, SL, BZ_MIN, BZ_MAX)
values (5, '名称5', 19, 1, 9);---表tb_jsgs记录(9条记录以内,数量是动态的)
ID MC SL BZ_MIN BZ_MAX
1 名称1 20 1 10
2 名称2 25 2 9
3 名称3 30 1 9
4 名称4 15 4 7
5 名称5 19 1 9 -- Create table
create table TB_DATA
(
  BZZH VARCHAR2(100),
  JSSL NUMBER(5)
);
-- Add comments to the columns 
comment on column TB_DATA.BZZH
  is '比重组合';
comment on column TB_DATA.JSSL
  is '计算数量';-----表TB_DATA记录很多
BZZH            JSSL
1,2,1,4,1        19
……………………其中TB_DATA表的数据是利用存储过程,按照一定规则根据表tb_jsgs记录循环求出来的,规则如下:for V_NUM1 in 1 .. 10 loop --名称1 循环BZ_MIN 到BZ_MAX
        for V_NUM2 in 2 .. 9 loop --名称2 循环BZ_MIN 到BZ_MAX
          for V_NUM3 in 1 .. 9 loop --名称3 循环BZ_MIN 到BZ_MAX
            for V_NUM4 in 4 .. 7 loop --名称4 循环BZ_MIN 到BZ_MAX
              for V_NUM5 in 1 .. 9 loop --名称5 循环BZ_MIN 到BZ_MAX                  insert into TB_DATA
                    (BZZH, JSSL)
                  values
                    (to_char(V_NUM1) || ',' || to_char(V_NUM2) || ',' ||
     to_char(V_NUM3) || ',' || to_char(V_NUM4) || ',' ||
     to_char(V_NUM5),
     trunc((V_NUM1*20+V_NUM2*25+V_NUM3*30+V_NUM4*15+V_NUM5*19)
          /(V_NUM1+V_NUM2+V_NUM3+V_NUM4+V_NUM5)));              end loop;
            end loop;
          end loop;
        end loop;
      end loop;我的问题:
表tb_jsgs的记录数是动态的,怎么写出通用的存储过程???

解决方案 »

  1.   

    你的生成TB_DATA中数据的计算公式是什么?
      

  2.   

    公式就是:
    trunc((V_NUM1*20+V_NUM2*25+V_NUM3*30+V_NUM4*15+V_NUM5*19) /(V_NUM1+V_NUM2+V_NUM3+V_NUM4+V_NUM5)))其中:
    V_NUM1、V_NUM2、V_NUM3、V_NUM4、V_NUM5是5重循环的变量(范围是TB_JSGS.BZ_MIN到TB_JSGS.BZ_MAX),
    V_NUM1*20+V_NUM2*25+V_NUM3*30+V_NUM4*15+V_NUM5*19中的20、25、30、15、19是TB_JSGS.sl字段。
      

  3.   


    declare
    cursor c1 is select id,bz_min,bz_max,sl
                   from tb_jsgs
               order by id;
    v_str varchar2(4000);
    v_str_end varchar2(4000);
    v_col1 varchar2(4000);
    v_col2 varchar2(4000);
    v_insert varchar2(4000);
    v_col3 varchar2(4000);
    v_exe varchar2(4000);
    begin
         for a in c1 loop
             v_str := v_str||' for v_num'||a.id||' in '||a.bz_min||'..'||a.bz_max||' loop ';
             v_str_end := v_str_end||' end loop;';
             v_col1 := v_col1||' to_char(v_num'||a.id||')||'',''||';
             v_col2 := v_col2||' v_num'||a.id||'*'||a.sl||'+';
             v_col3 := v_col3||' v_num'||a.id||'+';
         end loop;
         
         v_insert := 'insert into tb_data(bzzh,jssl) values('||rtrim(v_col1,'||'',''||')||', trunc(('||rtrim(v_col2,'+')||')/('||rtrim(v_col3,'+')||')));';
         
         v_exe := 'begin '||v_str||' '||v_insert||' '||v_str_end||' end;';
         execute immediate v_exe;
    end;
      

  4.   

    汗,oracle还可以这样啊
    让我想起了当年的foxpro