之前弄了一个类似的帖子,问了好多问题,受益颇多,可要自己写起来由于需求多,还不会很会弄成一个动态的,要不我前台得好多界面了,所以再次求助各高手,帮我设计一个动态的存储过程。此外呢,有没有好的前台动态生成表格的方法,或者表格插件,提供给我就更好了,我这里主要要做一些报表显示
现在需求如下:主要字段:equkind(设备种类,String类型),equsubkind(设备型号)
                       checkindate(入所时间,date类型),factory(厂家名称)
                      state(设备状态:比如有a状态,b状态等),place(仓库位置)等字段
                      有些是要动态传入的,比如要显示的字段名
比如有数据如下:查询的数量是这个设备种类的记录数
id     equkind      checkindate  factory  place  state  equsubkind
t001 交流电动转辙机 2010-01-10    北京    仓库1  入所    交流1型
t001 交流电动转辙机 2010-02-11    上海    仓库1  检修    交流2型
t002 直流电动转辙机 2010-01-12    天津    仓库2  途中    直流1
t002 直流电动转辙机 2010-02-13    北京    仓库3  现场    直流1
t002 直流电动转辙机 2010-01-11    大连    仓库4  途中    直流2
t002 直流电动转辙机 2010-03-11    广州    仓库3  如所    直流3要显示的结果为:
  设备种类    1月 2月 3月 一季度 4月 5月 6月 2季度 7月 8月 9月 3季度 10月 11月 12月 4季度 总计
交流电动转辙机 1   1   0   2 。 。 。
直流电动转辙机 2   3   1   6 。 。 。  
 总计          3   4   1   8 。 。 。这是其中一个效果。
(2)按某年的12个月统计,某年某月-月统计,跨年(year1-year2) 的统计报表
(3)Decode(Grouping(equkind),1,''总计'',equkind) as "设备总类",
这句话是第一列按照设备名进行统计,要是按照别的列进行统计,那么该如何动态传进这个equkind字段,意思就是这个字段是变化的,比如我按照生产厂家统计一年内的。
这个报表字段有设备种类,生产厂家,入时间,所在仓库,也就是说可能这个字段作为统计项,别的因素是条件,然后可能下次它就变成条件了,怎么动态传参啊
(4)最好加入分页,就是oracle三层嵌套,用rownum进行分页,传入参数为pagesize和pagenow
(5)条件是动态的,用户选择是按照什么方式(年,月,跨年),组合方式,要显示的列组合,然后调用存储过程

总之,要统计的列是动态的,要统计的内容也是动态的,最好是一个动态的模板,
写的有点乱,我对统计也刚接触,思维乱乱的 也不知道怎么描述。反正就是用户可能根据多字段,多条件进行报表查询,统计的是数量
先谢谢了

解决方案 »

  1.   


    --之前不是给你写了的吗?你修改下就行了,统计动态来做
    --如下:Connected to:
    Oracle Database 10g Release 10.1.0.2.0 - ProductionSQL> set serveroutput ON
    SQL> alter session set nls_date_format='yyyy-mm-dd';Session altered.SQL> --初始数据:
    SQL> select * from tab2;ID       EQUKIND                                    CHECKINDAT FACTORY      PLACE          STATE        EQUSUBKIND
    -------- ------------------------------------------ ---------- ------------ -------------- ---------
    t001     交流电动转辙机                             2010-01-10 北京         仓库1          入所         交流1型
    t001     交流电动转辙机                             2010-02-11 上海         仓库1          检修         交流2型
    t002     直流电动转辙机                             2010-01-12 天津         仓库2          途中         直流1
    t002     直流电动转辙机                             2010-02-13 北京         仓库3          现场         直流1
    t001     交流电动转辙机                             2010-01-11 大连         仓库4          途中         交流2型
    t002     直流电动转辙机                             2010-03-11 广州         仓库3          入所         直流3
    t001     直流电动转辙机                             2010-05-11 广州         仓库3          入所         直流3
    t002     交流电动转辙机                             2010-06-12 北京         仓库1          入所         交流1型
    t002     交流电动转辙机                             2010-05-13 上海         仓库1          检修         交流2型
    t002     直流电动转辙机                             2010-06-11 大连         仓库4          途中         直流2
    t002     直流电动转辙机                             2010-08-11 广州         仓库3          入所         直流3ID       EQUKIND                                    CHECKINDAT FACTORY      PLACE          STATE        EQUSUBKIND
    -------- ------------------------------------------ ---------- ------------ -------------- ---------
    t001     直流电动转辙机                             2010-09-11 天津         仓库2          途中         直流1
    t001     直流电动转辙机                             2010-12-11 大连         仓库4          途中         直流213 rows selected.SQL> --动态过程:
    CREATE OR REPLACE PROCEDURE p_get_info2(
                                v_groupcol     IN  VARCHAR2,     --统计字段,可能是设备种类,生产厂家,所在仓库
                                v_id           IN  VARCHAR2,     --直流交流类型
                                v_checkindate  IN  VARCHAR2,     --时间
                                resuleSet      OUT sys_refcursor --返回结果集
                                )
         IS
           sql_str VARCHAR2(4000);
         BEGIN
              sql_str:=
              'SELECT
                    Decode(Grouping('||v_groupcol||'),1,''总计'','||v_groupcol||') as '||v_groupcol||',
                    Sum(Decode(To_Char(checkindate,''mm''),''01'',1,0)) "1月",
                    Sum(Decode(To_Char(checkindate,''mm''),''02'',1,0)) "2月",
                    Sum(Decode(To_Char(checkindate,''mm''),''03'',1,0)) "3月",
                    Sum(Decode(to_char(checkindate,''q''),1,1,0)) "一季度",
                    Sum(Decode(To_Char(checkindate,''mm''),''04'',1,0)) "4月",
                    Sum(Decode(To_Char(checkindate,''mm''),''05'',1,0)) "5月",
                    Sum(Decode(To_Char(checkindate,''mm''),''06'',1,0)) "6月",
                    Sum(Decode(to_char(checkindate,''q''),2,1,0)) "二季度",
                    Sum(Decode(To_Char(checkindate,''mm''),''07'',1,0)) "7月",
                    Sum(Decode(To_Char(checkindate,''mm''),''08'',1,0)) "8月",
                    Sum(Decode(To_Char(checkindate,''mm''),''09'',1,0)) "9月",
                    Sum(Decode(to_char(checkindate,''q''),3,1,0)) "三季度",
                    Sum(Decode(To_Char(checkindate,''mm''),''10'',1,0)) "10月",
                    Sum(Decode(To_Char(checkindate,''mm''),''11'',1,0)) "11月",
                    Sum(Decode(To_Char(checkindate,''mm''),''12'',1,0)) "12月",
                    Sum(Decode(to_char(checkindate,''q''),4,1,0)) "四季度",
                    Count(1) "总计"
              FROM (SELECT * FROM tab2 WHERE id='''||v_id||''' 
                    AND checkindate <= to_date('''||v_checkindate||''',''yyyy-mm-dd'')
                    )
              GROUP BY GROUPING SETS(('||v_groupcol||'),())';
              --Dbms_Output.put_line(sql_str);
              OPEN resuleSet FOR sql_str; 
         END;
    /
    SQL> --测试1:以设备统计
    SQL> var cur refcursor
    SQL> exec p_get_info2('equkind','t001','2010-11-10',:cur);PL/SQL procedure successfully completed.SQL> print curEQUKIND    1月  2月  3月  一季度  4月  5月  6月  二季度  7月  8月  9月  三季度  10月  11月  12月  四季度  总计
    -----------------------------------------------------------------------------------------------------
    交流电动转辙机 2 1 0 3 0 0 0 0 0 0 0 0 0 0 0 0 3
    直流电动转辙机 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 2
    总计           2 1 0 3 0 1 0 1 0 0 1 1 0 0 0 0 5
     
    SQL> --测试2:以 生产厂家 统计
    SQL> var cur refcursor
    SQL> exec p_get_info2('factory','t001','2010-11-10',:cur);PL/SQL procedure successfully completed.SQL> print curFACTORY   1月  2月  3月  一季度  4月  5月  6月  二季度  7月  8月  9月  三季度  10月  11月  12月  四季度  总计
    -----------------------------------------------------------------------------------------------------
    上海 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
    北京 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
    大连 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
    天津 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1
    广州 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1
    总计 2 1 0 3 0 1 0 1 0 0 1 1 0 0 0 0 5SQL> --测试3:以 所在仓库 统计
    SQL> var cur refcursor
    SQL> exec p_get_info2('place','t001','2010-11-10',:cur);PL/SQL procedure successfully completed.SQL> print curPLACE  1月  2月  3月  一季度  4月  5月  6月  二季度  7月  8月  9月  三季度  10月  11月  12月  四季度  总计
    -----------------------------------------------------------------------------------------------------
    仓库1 1 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 2
    仓库2 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1
    仓库3 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1
    仓库4 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
    总计  2 1 0 3 0 1 0 1 0 0 1 1 0 0 0 0 5
      

  2.   

    很谢谢你这几次的耐心帮助,我的月和年度统计做好了,那个跨年的还没有什么好的思路,就是用户输入起始年份year1,year2,然后统计数量,能再帮我做下吗
      

  3.   

    呵呵 是我说的不具体,真开心你还在线。拟合数据如下:
       equkind    indate  factory  place  equsubkind   outdate     
      交流机    2007-01-10  北京     仓库1     交流1型     2010-02-10
      交流机    2007-01-12  北京     仓库1     交流1型     2011-02-12
      交流机    2008-01-10  北京     仓库2      交流2型     2010-02-10
      交流机    2009-01-10  北京     仓库1      交流1型     2009-02-10
      直流机    2010-01-10  北京     仓库1      交流1型     2009-02-10
    比如,用户输入要跨年2005-2010进行查询,按照 equkind , 入时间indate进行查询,结果应为:
    设备种类 2005  2006 2007 2008 2009 2010 2011 2012
    交流机    0     0    2     1     1   1   0     0
    同时,也可以按照outdate出时间,equsubkind字段进行查询,
    或者按照equsubkind 字段进行这种跨年的查询。
    -------------------------------------------------------------
    对了,不知道这个难吗?
    比如 我要显示两列的跨年,是不是多列的道理都是一样的呢。这个我不知道结果是怎么样的,我想对于用户来说,应该有这样的需求吧
    equkind factory 2005 2006 2007 2008 2009 2010 2011 2012
      

  4.   

    初步看了下,
    1、由于你这个跨年是不固定的,肯定要动态来做,坛子里之前狂狼写的一个通用的行列转换的帖子,你可以参考下
    你先根据你参数跨年2005-2010 来构造一个行级的表,然后和你原表按照年份来进行一个关联处理,思路大概是这个样子,
    具体实施起来可能会遇到点麻烦,你先尝试做,我有时间再看
    2、两列的跨年 是类似的,只是分组多一个而已狂狼动态行列转换的例子你参考:http://topic.csdn.net/u/20100109/13/6a10c168-f190-4766-b838-adbf03c4ac7b.html?28835
      

  5.   

    Connected to:
    Oracle Database 10g Release 10.1.0.2.0 - ProductionSQL> set serveroutput ON
    SQL> alter session set nls_date_format='yyyy-mm-dd';Session altered.SQL> --初始数据:
    SQL> SELECT * FROM tab3;ID       EQUKIND                                    CHECKINDAT FACTORY      PLACE          STATE        EQUSUBKIND
    -------- ------------------------------------------ ---------- ------------ -------------- ---------
    t001     交流电动转辙机                             2010-01-10 北京         仓库1          入所         交流1型
    t001     交流电动转辙机                             2005-02-11 上海         仓库1          检修         交流2型
    t002     直流电动转辙机                             2006-01-12 天津         仓库2          途中         直流1
    t002     直流电动转辙机                             2006-02-13 北京         仓库3          现场         直流1
    t001     交流电动转辙机                             2008-01-11 大连         仓库4          途中         交流2型
    t002     直流电动转辙机                             2009-03-11 广州         仓库3          入所         直流3
    t001     直流电动转辙机                             2009-05-11 广州         仓库3          入所         直流3
    t002     交流电动转辙机                             2010-06-12 北京         仓库1          入所         交流1型
    t002     交流电动转辙机                             2010-05-13 上海         仓库1          检修         交流2型
    t002     直流电动转辙机                             2011-06-11 大连         仓库4          途中         直流2
    t002     直流电动转辙机                             2012-08-11 广州         仓库3          入所         直流3ID       EQUKIND                                    CHECKINDAT FACTORY      PLACE          STATE        EQUSUBKIND
    -------- ------------------------------------------ ---------- ------------ -------------- ---------
    t001     直流电动转辙机                             2010-09-11 天津         仓库2          途中         直流1
    t001     直流电动转辙机                             2010-12-11 大连         仓库4          途中         直流213 rows selected.SQL> --动态过程:
    CREATE OR REPLACE PROCEDURE p_get_info3(
                                v_groupcol     IN  VARCHAR2,     --统计字段,可能是设备种类,生产厂家,所在仓库
                                v_id           IN  VARCHAR2,     --直流交流类型
                                v_indate_from  IN  VARCHAR2,     --checkindate的起始时间
                                v_indate_to    IN  VARCHAR2,     --checkindate的结束时间
                                resuleSet      OUT sys_refcursor --返回结果集
                                )
    AS
      sqlstr varchar2(2000):='SELECT Decode(Grouping('||v_groupcol||'),1,''总计'','||v_groupcol||') as '||v_groupcol;
      c1 sys_refcursor;
      v1 varchar2(100);
      v_year NUMBER;   --起止跨度的年份
    BEGIN
        SELECT (v_indate_to-v_indate_from)+1 into v_year FROM dual ;
        open c1 for 'WITH tab AS(SELECT '||v_indate_from||'+LEVEL-1 YEAR FROM dual CONNECT BY LEVEL<='||v_year||')SELECT YEAR FROM tab';
        loop
            fetch c1 into v1;
            exit when c1%notfound;
            sqlstr:=sqlstr||chr(10)||',Sum(decode(to_char(checkindate,''yyyy''),'''||v1||''',1,0))'||'"'||v1||'"';
        end loop;
        close c1;
        sqlstr:=sqlstr||' FROM (SELECT * FROM tab3 WHERE id like '''||v_id||''') GROUP BY GROUPING SETS(('||v_groupcol||'),())';
        OPEN resuleSet FOR sqlstr;
    END;--测试1:以设备统计
    SQL> var cur refcursor
    SQL> exec p_get_info3('equkind','%','2005','2010',:cur);PL/SQL procedure successfully completed.SQL> print curEQUKIND        2005  2006  2007  2008  2009  2010
    -----------------------------------------------------------
    交流电动转辙机 1 0 0 1 0 3
    直流电动转辙机 0 2 0 0 2 2
    总计           1 2 0 1 2 5SQL> --测试2:以 生产厂家 统计
    SQL> var cur refcursor
    SQL> exec p_get_info3('factory','%','2005','2010',:cur);PL/SQL procedure successfully completed.SQL> print curFACTORY        2005  2006  2007  2008  2009  2010
    -----------------------------------------------------------
    上海 1 0 0 0 0 1
    北京 0 1 0 0 0 2
    大连 0 0 0 1 0 1
    天津 0 1 0 0 0 1
    广州 0 0 0 0 2 0
    总计 1 2 0 1 2 5
     
      

  6.   

    上面我只是按照checkindate来跨年份的,你再测试下,理解之后再根据你自己需求改改
      

  7.   


    --上面过程再修改下,没有行的统计汇总,如下:
    SQL> --动态过程:
    CREATE OR REPLACE PROCEDURE p_get_info3(
                            v_groupcol     IN  VARCHAR2,     --统计字段,可能是设备种类,生产厂家,所在仓库
                                v_id           IN  VARCHAR2,     --直流交流类型
                                v_indate_from  IN  VARCHAR2,     --checkindate的起始时间
                                v_indate_to    IN  VARCHAR2,     --checkindate的结束时间
                                resuleSet      OUT sys_refcursor --返回结果集
                                )
    AS
      sqlstr varchar2(2000):='SELECT Decode(Grouping('||v_groupcol||'),1,''总计'','||v_groupcol||') as '||v_groupcol;
      c1 sys_refcursor;
      v1 varchar2(100);
      v_year NUMBER;   --起止跨度的年份
    BEGIN
        SELECT (v_indate_to-v_indate_from)+1 into v_year FROM dual ;
        open c1 for 'WITH tab AS(SELECT '||v_indate_from||'+LEVEL-1 YEAR FROM dual CONNECT BY LEVEL<='||v_year||')SELECT YEAR FROM tab';
        loop
            fetch c1 into v1;
            exit when c1%notfound;
            sqlstr:=sqlstr||chr(10)||',Sum(decode(to_char(checkindate,''yyyy''),'''||v1||''',1,0))'||'"'||v1||'"';
        end loop;
        close c1;
        sqlstr:=sqlstr||',Count(1) "总计" FROM 
        (SELECT * FROM tab3 WHERE id like '''||v_id||''' AND checkindate between to_date('''||v_indate_from||''',''yyyy'') and to_date('''||v_indate_to||''',''yyyy'')) 
        GROUP BY GROUPING SETS(('||v_groupcol||'),())';
        OPEN resuleSet FOR sqlstr;
    END;--测试1:以设备统计
    SQL> var cur refcursor
    SQL> exec p_get_info3('equkind','%','2005','2010',:cur);PL/SQL procedure successfully completed.
    SQL> print curEQUKIND                                          2005       2006       2007       2008       2009       2010        总计
    ------------------------------------------ ---------- ---------- ---------- ---------- ---------- -----------   --------
    交流电动转辙机                                      0          0          0          1          0          3          4
    直流电动转辙机                                      0          2          0          0          2          1          5
    总计                                                0          2          0          1          2          4          9SQL> SQL> --测试2:以 生产厂家 统计
    SQL> var cur refcursor
    SQL> exec p_get_info3('factory','%','2005','2010',:cur);PL/SQL procedure successfully completed.SQL> print cur
    FACTORY            2005       2006       2007       2008       2009       2010       总计
    ------------ ---------- ---------- ---------- ---------- ---------- ---------- ----------
    上海                  0          0          0          0          0          1          1
    北京                  0          1          0          0          0          2          3
    大连                  0          0          0          1          0          0          1
    天津                  0          1          0          0          0          1          2
    广州                  0          0          0          0          2          0          2
    总计                  0          2          0          1          2          4          96 rows selected.SQL> 
     
                       
    SQL> --测试3:以 所在仓库 统计
    SQL> var cur refcursor
    SQL> exec p_get_info3('place','%','2005','2010',:cur);PL/SQL procedure successfully completed.SQL> print curPLACE                2005       2006       2007       2008       2009       2010       总计
    -------------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
    仓库1                   0          0          0          0          0          3          3
    仓库2                   0          1          0          0          0          1          2
    仓库3                   0          1          0          0          2          0          3
    仓库4                   0          0          0          1          0          0          1
    总计                    0          2          0          1          2          4          9SQL> 
      

  8.   

    paddy有三个意思:
    1.米
    2.贵族
    3.笨蛋
    嘿嘿~paddy!你是哪个呢?不会是最后一个吧!嘎嘎~~~~~
      

  9.   

    --两列的实现是一样的,只是多一个分组而已:
    SQL> --动态过程:
    CREATE OR REPLACE PROCEDURE p_get_info4(                                       
                            v_equkind      IN  VARCHAR2,     --设备种类
                                v_factory      IN  VARCHAR2,     --生产厂家
                                v_id           IN  VARCHAR2,     --直流交流类型
                                v_indate_from  IN  VARCHAR2,     --checkindate的起始时间
                                v_indate_to    IN  VARCHAR2,     --checkindate的结束时间
                                resuleSet      OUT sys_refcursor --返回结果集
                                )
    AS
      sqlstr varchar2(2000):='SELECT 
                                   Decode(grouping_id('||v_equkind||','||v_factory||'),3,''总计'',1,''小计'','||v_equkind||') as '||v_equkind
                                ||',Decode(grouping_id('||v_equkind||'),1,''总计'','||v_factory||') as '||v_factory;
      c1 sys_refcursor;
      v1 varchar2(100);
      v_year NUMBER;   --起止跨度的年份
    BEGIN
        SELECT (v_indate_to-v_indate_from)+1 into v_year FROM dual ;
        open c1 for 'WITH tab AS(SELECT '||v_indate_from||'+LEVEL-1 YEAR FROM dual CONNECT BY LEVEL<='||v_year||')SELECT YEAR FROM tab';
        loop
            fetch c1 into v1;
            exit when c1%notfound;
            sqlstr:=sqlstr||chr(10)||',Sum(decode(to_char(checkindate,''yyyy''),'''||v1||''',1,0))'||'"'||v1||'"';
        end loop;
        close c1;
        sqlstr:=sqlstr||chr(10)||',Count(1) "总计" FROM
        (SELECT * FROM tab3 WHERE id like '''||v_id||''' AND checkindate between to_date('''||v_indate_from||''',''yyyy'') and to_date('''||v_indate_to||''',''yyyy''))
        GROUP BY rollup('||v_equkind||','||v_factory||')';
        OPEN resuleSet FOR sqlstr;
    END;SQL> --测试
    SQL> var cur refcursor
    SQL> exec p_get_info4('equkind','factory','%','2005','2010',:cur);PL/SQL procedure successfully completed.SQL> print curEQUKIND         FACTO 2005 2006 2007 2008 2009 2010       总计
    --------------- ----- ---- ---- ---- ---- ---- ---- ----------
    交流电动转辙机  上海     0    0    0    0    0    1          1
    交流电动转辙机  北京     0    0    0    0    0    2          2
    交流电动转辙机  大连     0    0    0    1    0    0          1
    小计                     0    0    0    1    0    3          4
    直流电动转辙机  北京     0    1    0    0    0    0          1
    直流电动转辙机  天津     0    1    0    0    0    1          2
    直流电动转辙机  广州     0    0    0    0    2    0          2
    小计                     0    2    0    0    2    1          5
    总计            总计     0    2    0    1    2    4          99 rows selected.SQL> 
      

  10.   

    十分感谢, 真是强大啊 .还得麻烦指导一下
    id equkind       checkindate checkdate    outdate    checkpeople  outpeople
    t001 交流电动转辙机 2010-01-10 2010-01-10  2010-01-10    张三             张四
    t001 交流电动转辙机 2010-02-11 2010-01-10  2010-01-10     李四             李五
    t002 直流电动转辙机 2010-01-12 2010-01-10  2010-01-10    王五             张三
    t002 直流电动转辙机 2010-02-13 2010-01-10  2010-01-10    张三             钱一
    t002 直流电动转辙机 2010-01-11 2010-01-10  2010-01-10    李四             钱二我想要实现:按照 checkpeople(检验人员)或者 outpeople验收人员 进行统计
                    比对字段分别是checkdate检验日期  outdate验收日期
    达到效果如下
    比如:按照checkpeople
    equkind       张三   李四 ......
    交流电动转辙机   2     .   ...
    .               .    .   ...
      

  11.   


    --参数:checkpeople(检验人员)或者 outpeople验收人员
    --只能折一输入统计
    CREATE OR REPLACE PROCEDURE p_get_info5(
                            v_equkind      IN  VARCHAR2,     --设备种类
                                v_id           IN  VARCHAR2,     --直流交流类型
                                v_checkpeople  IN  VARCHAR2,     --检验人员
                                v_outpeople    IN  VARCHAR2,     --验收人员
                                resuleSet      OUT sys_refcursor --返回结果集
                                )
    AS
      sqlstr varchar2(2000):=''||Chr(10)||'SELECT'||Chr(10)||'     Decode(grouping('||v_equkind||'),1,''总计'','||v_equkind||') as '||v_equkind;
      c1 sys_refcursor;
      v1 varchar2(100);
    BEGIN
        IF v_checkpeople IS NOT NULL THEN 
            open c1 for 'SELECT DISTINCT '||v_checkpeople||' FROM tab5';
            loop
                fetch c1 into v1;
                exit when c1%notfound;
                sqlstr:=sqlstr||chr(10)||'    ,Sum(decode(checkpeople,'''||v1||''',1,0))'||'"'||v1||'"';
            end loop;
            close c1;
            sqlstr:=sqlstr||chr(10)||'    ,Count(1) "总计" '||chr(10)||'FROM
            (SELECT * FROM tab5 WHERE id like '''||v_id||''')'||chr(10)||'GROUP BY rollup('||v_equkind||')';
        END IF ;
        IF v_outpeople IS NOT NULL THEN 
            open c1 for 'SELECT DISTINCT '||v_outpeople||' FROM tab5';
            loop
                fetch c1 into v1;
                exit when c1%notfound;
                sqlstr:=sqlstr||chr(10)||'    ,Sum(decode(outpeople,'''||v1||''',1,0))'||'"'||v1||'"';
            end loop;
            close c1;
            sqlstr:=sqlstr||chr(10)||'    ,Count(1) "总计" '||chr(10)||'FROM
            (SELECT * FROM tab5 WHERE id like '''||v_id||''')'||chr(10)||'GROUP BY rollup('||v_equkind||')';
        END IF ;
        OPEN resuleSet FOR sqlstr;
    END;SQL> --测试 :Connected to:
    Oracle Database 10g Release 10.1.0.2.0 - ProductionSQL> set serveroutput on 
    SQL> set linesize 32767
    SQL> alter session set nls_date_format='yyyy-mm-dd';Session altered.SQL> --初始数据:
    SQL> select * from tab5;ID       EQUKIND                          CHECKINDAT CHECKDATE  OUTDATE    CHECKPEOPLE  OUTPEOPLE
    -------- -------------------------------- ---------- ---------- ---------- ------------ -----------
    t001     交流电动转辙机                   2010-01-10 2010-01-10 2010-01-10 张三         张四
    t001     交流电动转辙机                   2010-02-11 2010-01-10 2010-01-10 李四         李五
    t002     直流电动转辙机                   2010-01-12 2010-01-10 2010-01-10 王五         张三
    t002     直流电动转辙机                   2010-02-13 2010-01-10 2010-01-10 张三         钱一
    t002     直流电动转辙机                   2010-01-11 2010-01-10 2010-01-10 李四         钱二SQL> var cur refcursorSQL> --测试一:checkpeople检验人员 进行统计
    SQL> exec p_get_info5('equkind','%','checkpeople',null,:cur); PL/SQL procedure successfully completed.SQL> print curEQUKIND                                张三       李四       王五       总计
    -------------------------------- ---------- ---------- ---------- ----------
    交流电动转辙机                            1          1          0          2
    直流电动转辙机                            1          1          1          3
    总计                                      2          2          1          5
    SQL> --测试二:outpeople验收人员 进行统计
    SQL> exec p_get_info5('equkind','%',null,'outpeople',:cur); PL/SQL procedure successfully completed.SQL> print curEQUKIND                             张三       张四       李五       钱一       钱二       总计
    ----------------------------- ---------- ---------- ---------- ---------- ---------- ----------
    交流电动转辙机                         0          1          1          0          0          2
    直流电动转辙机                         1          0          0          1          1          3
    总计                                   1          1          1          1          1          5SQL> 
      

  12.   

    我的model 实体bean
    public class SysObject implements java.io.Serializable {
    private static final long serialVersionUID = -8811739550134523346L; private String objname1;
    private String objname2;
    private String objname3;
    private String objname4;
    private String objname5;
    。。
    set,get()方法省略

    }       List<SysObject> list = new ArrayList<SysObject>();
           SysObject o = null;
                    Session session = (Session) getSession();
    Connection conn = session.connection();
    ResultSet rs = null;
    try {
    CallableStatement cstmt = conn
    .prepareCall("{call YEARAREA_REPORT(?,?,?,?,?)}");
    cstmt.setString(1, fieldName);// 输入查询字段参数
    cstmt.setString(2, from_year);// 查询起始年份
    cstmt.setString(3, to_year);// 查询末年份
    cstmt.registerOutParameter(5, OracleTypes.CURSOR);//返回结果集
    cstmt.execute();
    rs = (ResultSet) cstmt.getObject(5);
                             while (rs.next()) {
    o = new SysObject();
    o.setObjname1(rs.getString(fieldName));//第一列名
    o.setObjname2(rs.getString(2));//2000年
    o.setObjname3(rs.getString(3)); //2001
    o.setObjname4(rs.getString(4));//2002
    o.setObjname5(rs.getString(5));//2003
    o.setObjname6(rs.getString(6));//2004
    o.setObjname7(rs.getString(7));//2005
    o.setObjname8(rs.getString(8));//总计
    list.add(o);
    }
    rs.close(); } catch (Exception e) {
    e.printStackTrace();
    } finally {
    session.close();
    }
    return list;
    }
    这样的前提是我fromyear输入2000,toyear输入2005,所以我才知道要o.setObjname2-o.setObjname8
    现在我是写死的,没办法啊
    假如fromyear和toyear不定,我该如何把结果集装入list呢?
    比如,fromyear是2000,toyear是2002
    那么我就得o.setObjname1--o.setObjname4就可以了
    动态参数一变,我就无法set了