表名:T_cmsScheme 
方案编号 方案名称 单位ID             历史记录表
Fnumber  Fname    ForgID             FHisTableName
A001     方案1    R1                 T_DB_4500
A002     方案2    R1                 T_DB_8872
A003     方案3    R2                 T_DB_9983单位表名:T_orgAdmin
单位ID   单位编码    单位名称
ForgID  ForgNumber    ForgName
R1 01.01.02    一分公司_本部_人事部
R2 01.01       一分公司_本部
    临时表名:T_DB_4501 
期间ID     应发工资  实发工资
FPeriodID    FYF001  FSF002
p1           1000    1200
p1           1400    1500
p2           2000    2100
p2           3000    3100临时表名:T_DB_8872 
期间ID    应发工资   实发工资
FPeriodID  FYF001    FSF002
p2         4000      3000
p2         2800      2500
p3         1000      1200
p4         1200      1300
p5         2000      2200
临时表名:T_DB_9983 
期间ID     应发工资   实发工资
FPeriodID   FYF001    FSF002
p2          3000      2000
p2          2300      2500
薪资期间表:T_cmpPeriod
FPeriodID  FPeriodNum  FPeriodName
p1         201001      201001
p2         201002      201002
p3         201003      201003
p4         201004      201004
p5         201005      201005
--存储过程输出结果集,
--条件:汇总单位编码为01.01.02且薪资期间编号在201001~201002范围内的应发工资及实发工资合计
方案编号 方案名称 单位编码   单位名称              应发工资   实发工资
Fnumber  Fname   ForgNumber  ForgName              FYF001      FSF002
A001    方案1    01.01.02    一分公司_本部_人事部  7400         7900
A002    方案2    01.01.02    一分公司_本部_人事部  6800          5500以上是该存储过程需要涉及到的表结构、测试数据及输出的结果集.
先将T_cmsScheme 和 T_orgAdmin 连接, 根据输入参数ForgNumber比较T_orgAdmin 的ForgNumber字段,筛出对应的方案,再找出这些方案的FHisTableName ,根据字段值显示的临时表名去查其期间编码在[FPrdNumFrom,FPrdNumTo]范围内的实发工资及应发工资合计值(各临时表的FPeriodID与薪资期间表T_cmpPeriod的FPeriodID字段关联),与方案一起输出一个结果集。
临时表T_DB_4500、T_DB_8872、T_DB_9983 是主表T_cmsScheme的FHisTableName值,再根据这些临时表去汇总对应字段的汇总值,合并到主表中输出。请各位高手各显神通,帮忙将存储过程写出来,非常感谢了!

解决方案 »

  1.   


      -----我把那个修改了下,你打印出那个SQL看下,有没有语法错误,问题应该不大
      create or replace procedure helpBswendy(ForgNum    number,
                                              FPeriodNum number,
                                              resultSet  out sys_refcursor,
                                              o_ret      number,
                                              o_msg      varchar2) as
      v_FHisTableName varchar2(200);
      v_sql           varchar2(2000);
    begin
      select FHisTableName
        into v_FHisTableName
        from T_cmsScheme
       where ForgNumber := ForgNum;
      v_sql := 'select a.Fnumber,a.Fname,a.ForgNumber,a.ForgName,select sum(b.FYF001) from ' ||
               v_FHisTableName || ' FYF001,select sum(b.FSF002) from ||'
               v_FHisTableName
               '|| FSF002 from T_cmsScheme a' || ' where a.ForgNumber=' ||
               ForgNum || ' group by a.ForgNumber,a.Fnumber';
      open for resultSet;
    exception
      when others then
        o_ret := sqlcode;
        o_msg := sqlerrm(sqlcode);
    end;
      

  2.   

    http://topic.csdn.net/u/20101130/16/7a5e4a12-4157-4b0e-ae9d-4332b824700f.html已经回复