之前弄了一个类似的帖子,问了好多问题,受益颇多,可要自己写起来由于需求多,还不会很会弄成一个动态的,要不我前台得好多界面了,所以再次求助各高手,帮我设计一个动态的存储过程。此外呢,有没有好的前台动态生成表格的方法,或者表格插件,提供给我就更好了,我这里主要要做一些报表显示
现在需求如下:主要字段: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)条件是动态的,用户选择是按照什么方式(年,月,跨年),组合方式,要显示的列组合,然后调用存储过程
。
总之,要统计的列是动态的,要统计的内容也是动态的,最好是一个动态的模板,
写的有点乱,我对统计也刚接触,思维乱乱的 也不知道怎么描述。反正就是用户可能根据多字段,多条件进行报表查询,统计的是数量
先谢谢了
现在需求如下:主要字段: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)条件是动态的,用户选择是按照什么方式(年,月,跨年),组合方式,要显示的列组合,然后调用存储过程
。
总之,要统计的列是动态的,要统计的内容也是动态的,最好是一个动态的模板,
写的有点乱,我对统计也刚接触,思维乱乱的 也不知道怎么描述。反正就是用户可能根据多字段,多条件进行报表查询,统计的是数量
先谢谢了
--之前不是给你写了的吗?你修改下就行了,统计动态来做
--如下: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
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
1、由于你这个跨年是不固定的,肯定要动态来做,坛子里之前狂狼写的一个通用的行列转换的帖子,你可以参考下
你先根据你参数跨年2005-2010 来构造一个行级的表,然后和你原表按照年份来进行一个关联处理,思路大概是这个样子,
具体实施起来可能会遇到点麻烦,你先尝试做,我有时间再看
2、两列的跨年 是类似的,只是分组多一个而已狂狼动态行列转换的例子你参考:http://topic.csdn.net/u/20100109/13/6a10c168-f190-4766-b838-adbf03c4ac7b.html?28835
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
--上面过程再修改下,没有行的统计汇总,如下:
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>
1.米
2.贵族
3.笨蛋
嘿嘿~paddy!你是哪个呢?不会是最后一个吧!嘎嘎~~~~~
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>
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 . ...
. . . ...
--参数: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>
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了