使用 CSV 文件可以吗?也许你的例子简单了点,可以用SQL就能实现例如
SELECT 部门,
SUM(DECODE(性别,'男',1,0)) MAN,
SUM(DECODE(性别,'女',1,0)) WOMAN,
SUM(DECODE(学历,'大学',1,0)) DXUE,
SUM(DECODE(学历,'本科',1,0)) BENKE
GROUP BY 部门
WHERE .......这只是对你的说明写的CURSOR 然后将数据,写到文件就可以了,不知道你的具体情况,所以不能给你更好的办法。
SELECT 部门,
SUM(DECODE(性别,'男',1,0)) MAN,
SUM(DECODE(性别,'女',1,0)) WOMAN,
SUM(DECODE(学历,'大学',1,0)) DXUE,
SUM(DECODE(学历,'本科',1,0)) BENKE
GROUP BY 部门
WHERE .......这只是对你的说明写的CURSOR 然后将数据,写到文件就可以了,不知道你的具体情况,所以不能给你更好的办法。
SELECT 部门,
SUM(DECODE(性别,'男',1,0)) MAN,
SUM(DECODE(性别,'女',1,0)) WOMAN,
SUM(DECODE(学历,'大学',1,0)) DXUE,
SUM(DECODE(学历,'本科',1,0)) BENKE
GROUP BY 部门 <----放到后面
WHERE .......
--很好的解决方法,只是应该把 GROUP BY 部门 放到where 的后面
你还是不要偷懒,把问题叙述清楚。不然怎么得到真正的答案呀。
实际情况并不是可以用一个GROUP BY 就可以分出来的
统计的每个单元格实际上都需要用一个比较复杂的查询语句才可以得到结果
并且查询的条件没有规律可言。在Oracle的存储过程中大体是这样的
CREATE OR REPLACE FUNCTION func_test(p_class VARCHAR2)
RETURN NUMBER IS
V_001 NUMBER;
V_002 NUMBER;
V_003 NUMBER;
.........
BEGIN
SELECT COUNT(*) INTO V_001 FROM 表 WHERE 条件1 AND 条件2 AND 条件3;
SELECT COUNT(*) INTO V_002 FROM 表 WHERE 条件2 AND 条件4 AND 条件5;
SELECT COUNT(*) INTO V_003 FROM 表 WHERE 条件1 AND 条件3 AND 条件6;
......
RETURN V_001;
......
END;这样将统计的数据作为输出变量返回
可问题是会有很多这样的变量,能不能将输出参数变为一个二维数组,一并返回
当然最好是直接写道一个XML文件里(不知道可行否),做为二进制文件进行存取。
CREATE OR REPLACE FUNCTION func_test(p_class VARCHAR2)
RETURN NUMBER IS
...返回一个数字,不大明白你的意思.
procedure xmltest(p_name users.name%type,buff out varchar2) as
vid users.id%type;
vname users.name%type;
doc xmldom.domdocument;
mainNode xmldom.domnode;
rootNode xmldom.domnode;
rootElem xmldom.domelement;
dataNode xmldom.domnode;
dataElem xmldom.domelement;
txtElem xmldom.domtext;
txtNode xmldom.domnode;
cursor vusers is
select id,name from users where name=xmltest.p_name;
begin
doc := xmldom.newdomdocument();
mainnode := xmldom.makenode(doc);
rootElem := xmldom.createelement(doc,'Users');
rootNode := xmldom.appendchild(mainnode,xmldom.makenode(rootElem));
open vusers;
loop
fetch vusers into vid,vname;
exit when vusers%notfound;
dataElem := xmldom.createelement(doc,'add');
dataNode := xmldom.makenode(dataElem);
xmldom.setattribute(dataElem,'ID',vid);
xmldom.setattribute(dataElem,'name',vname);
dataNode := xmldom.Appendchild(rootNode,dataNode);
txtElem := xmldom.createtextnode(doc,'');
txtNode := xmldom.appendchild(dataNode,xmldom.makenode(txtElem));
end loop;
close vusers;
commit;
xmldom.Writetobuffer(doc,buff);
xmldom.freedocument(doc);
end xmltest;
格式大概这样,具体的数据,你自己替换就可以了
然后..断开数据库连接...然后...先根据表的情况..生产一个新的datable..先创建结构..然后..在把数据添进去...我用接口...没有定义返回类型..不定义输入的参数的类型和情况..然后...用接口继承...创建一个类..处理这个咚咚...返回一个datatable...(为了通用和复用)...我为了这样的动态交叉报表郁闷了3天..在oracle里面没有解决..所以..在.net里面做了...其实..我的pl/sql不是很熟悉...我觉得...在数据库里面也能实现..但是..从..软件工程的角度出发..你最好不要写在数据库里面...不利于复用和移植....本人比较菜...看高手出招...呵呵
假设我用一个结果表(物理的)来存储检索结果,该如何插入呢?只能用UPDATE么?
CREATE OR REPLACE FUNCTION func_test(p_class VARCHAR2)
RETURN NUMBER IS
V_001 NUMBER;
V_002 NUMBER;
V_003 NUMBER;
.........
BEGIN
SELECT COUNT(*) INTO V_001 FROM 表 WHERE 条件1 AND 条件2 AND 条件3;--将 统计出的数插入到结果表的1行1列
SELECT COUNT(*) INTO V_002 FROM 表 WHERE 条件2 AND 条件4 AND 条件5;;--将 统计出的数插入到结果表的1行1列 SELECT COUNT(*) INTO V_003 FROM 表 WHERE 条件1 AND 条件3 AND 条件6;;--将 统计出的数插入到结果表的2行1列 ......
RETURN V_001;
......
END;
不太同意这样的说法...你是站在前端开发者的角度来考虑..如果用数据库实现..我就不用操心你用什么开发工具了..只管提供接口就行...这才是有利于复用和移植..并且..如果是大量的数据记录进行复杂的统计..你把数据提到前面去做..效率肯定要低得多....呵呵...
is
type typNumber is table of number(10) index by binary_integer;
procedure testproc(p_1 ..., p_2 ..., p_ret out typNumber);
end testpkg;create or replace package body testpkg
is
procedure testproc(p_1 ..., p_2 ..., p_ret out typNumber)
is
begin
--将 统计出的数存入p_ret(1)变量中
SELECT COUNT(*) INTO p_ret(1) FROM 表 WHERE 条件1 AND 条件2 AND 条件3; --将 统计出的数存入p_ret(2)变量中
SELECT COUNT(*) INTO p_ret(1) FROM 表 WHERE 条件2 AND 条件4 AND 条件5; end testproc;end testpkg;最后返回p_ret()。
SUM(case when 性别='男' then 1 else 0 end ) MAN,
SUM(case when 性别='女'then 1 else 0 end ) WOMAN,
SUM(case when case when 学历='大学' then 1 else 0 end) DXUE,
SUM(case when 学历='本科' then 1 else 0 end) BENKE
GROUP BY 部门
WHERE .......
安装工具在官方网站可以找到
is
type typNumber is table of number(10) index by binary_integer;
procedure testproc(p_1 ..., p_2 ..., p_ret out typNumber);
end testpkg;create or replace package body testpkg
is
procedure testproc(p_1 ..., p_2 ..., p_ret out typNumber)
is
begin
--将 统计出的数存入p_ret(1)变量中
SELECT COUNT(*) INTO p_ret(1) FROM 表 WHERE 条件1 AND 条件2 AND 条件3; --将 统计出的数存入p_ret(2)变量中
SELECT COUNT(*) INTO p_ret(1) FROM 表 WHERE 条件2 AND 条件4 AND 条件5; end testproc;end testpkg;最后返回p_ret()。
我觉得就行啊 不错
不知能不能解决这个问题!见笑了!
-----------------------------------------------行转列案例:
1\求出所有的科目.
2\根据所有的科目动态生成一个CREATE 语句.此CREATE 语句为建立横着
的成绩的表命令.
3\通过动态SQL执行生成的SQL语句
4\求出所有的学生.
5\求每一门学生的每一门科目,依次填入横着的成绩表
create table score
(
xh varchar(4),
subject varchar(10),
score number(6,2) default 0
)
declare
cursor kmcur is select distinct subject from score;
cursor stucur is select distinct xh from score;
cursor scorecur(yourxh varchar) is select score from score where xh=yourxh;
mykm varchar(10):='';
myxh varchar(4):='';
createsql varchar(200):='';
vcursor int:=0;
myscore int:=0;
scorelist varchar(100):='';
insertstr varchar(200):='';
fineinsertstr varchar(200):='';
subjectlist varchar(100):='';
begin
insertstr:='insert into newscore (xh';
createsql:='create table newscore (xh varchar(4)';
open kmcur;
loop
fetch kmcur into mykm;
exit when kmcur%notfound;
createsql:=createsql||','||mykm||' '||'number(6,2)';
subjectlist:=subjectlist||','||mykm;
end loop;
close kmcur;
createsql:=createsql||')';
-- dbms_output.put_line(subjectlist);
insertstr:=insertstr||subjectlist||') values (';
-- dbms_output.put_line(insertstr);
vcursor:=dbms_sql.open_cursor;
dbms_sql.parse(vcursor,createsql,dbms_sql.native);
dbms_sql.close_cursor(vcursor);
open stucur;
loop
fetch stucur into myxh;
exit when stucur%notfound;
fineinsertstr:=insertstr||myxh||',';
open scorecur(myxh);
loop
fetch scorecur into myscore;
exit when scorecur%notfound;
-- dbms_output.put_line(myxh||' '||myscore);
scorelist:=scorelist||trim(to_char(myscore))||',';
end loop;
scorelist:=substr(scorelist,1,length(scorelist)-1);
execute immediate fineinsertstr||scorelist||')';
fineinsertstr:='';
scorelist:='';
close scorecur;
end loop;
close stucur;
end;
/
望各位多多讨论!共同学习!
good lucky!
北大青鸟宜昌斯瑞
真诚希望你能走入IT行业!
SUM(DECODE(性别,'男',1,0)) 男,
SUM(DECODE(性别,'女',1,0)) 女,
SUM(DECODE(学历,'大学',1,0)) 专科,
SUM(DECODE(学历,'本科',1,0)) 本科
GROUP BY 部门
WHERE 条件
up
up
up
up
up
可以先做一个数组,然后将条件依次录入数组(男,女,本科,大学................--根据入参依次取出),
再根据二楼给出的格式拼sql,即可。
当然在存储过程的开始设置入参:第一个:部门(要排序的字段),第二个性别,第三个学历...........(根据你表的字段个数)
执行所得的sql,填入xml里面即可!!!
能上 asktom.oralce.com 吗 能的话在上面搜搜dbms_sql 有可能对你的问题有帮助的