求一个存储过程

Ghosthuo 2012-12-18 05:07:55
系统表 mysystem
systemid
systemname

(系统分三类) (每类系统下还会有多个项目,各类系统下项目的基本信息字段是一样的,但各类系统的参数不一样(个数,值),每类系统下的不同项目的参数是一样的,但值有可能

不一样(这里又分为多组))
总的来说就是:三类系统,每个系统还都会分为多组,下在再有多个项目。


create table mysystem (
systemid int(10) NOT NULL AUTO_INCREMENT,
systemname varchar(20),
primary key(systemid)
);


insert into mysystem (systemname) values('systemA');
insert into mysystem (systemname) values('systemB');
insert into mysystem (systemname) values('systemC');






项目表 project (每套系统下又分多个组)

projectid
projectname
systemnum
groupnum


create table project(
projectid int(10) NOT NULL AUTO_INCREMENT,
projectname varchar(20),
systemnum int(10),
groupnum int(10),
primary key(projectid)
);


insert into project (projectname,systemnum,groupnum) values('projectA01',1,1);
insert into project (projectname,systemnum,groupnum) values('projectA02',1,1);
insert into project (projectname,systemnum,groupnum) values('projectA03',1,2);
insert into project (projectname,systemnum,groupnum) values('projectA04',1,2);
insert into project (projectname,systemnum,groupnum) values('projectA05',1,3);
insert into project (projectname,systemnum,groupnum) values('projectA06',1,3);

insert into project (projectname,systemnum,groupnum) values('projectB01',2,1);
insert into project (projectname,systemnum,groupnum) values('projectB02',2,1);
insert into project (projectname,systemnum,groupnum) values('projectB03',2,2);
insert into project (projectname,systemnum,groupnum) values('projectB04',2,2);
insert into project (projectname,systemnum,groupnum) values('projectB05',2,3);
insert into project (projectname,systemnum,groupnum) values('projectB06',2,3);

insert into project (projectname,systemnum,groupnum) values('projectC01',3,1);
insert into project (projectname,systemnum,groupnum) values('projectC02',3,1);
insert into project (projectname,systemnum,groupnum) values('projectC03',3,2);
insert into project (projectname,systemnum,groupnum) values('projectC04',3,2);
insert into project (projectname,systemnum,groupnum) values('projectC05',3,3);
insert into project (projectname,systemnum,groupnum) values('projectC06',3,3);






参数表 parametertable
pname
pvalue
systemnum
groupnum

每个参数都指定了名子,值,所属系统,所属组(如果systemnum为0表示所有系统都有这个参数,如果groupnum为0则表示所有组都有这个参数)



create table parametertable (
pname varchar(20) NOT NULL ,
pvalue double,
systemnum int(10),
groupnum int(10),
primary key(pname)

);


insert into parametertable (pname,pvalue,systemnum,groupnum) values('cs01',1.1,1,1);
insert into parametertable (pname,pvalue,systemnum,groupnum) values('cs02',1.2,1,2);
insert into parametertable (pname,pvalue,systemnum,groupnum) values('cs03',2.1,2,1);
insert into parametertable (pname,pvalue,systemnum,groupnum) values('cs04',2.2,2,2);
insert into parametertable (pname,pvalue,systemnum,groupnum) values('cs05',3.1,3,1);
insert into parametertable (pname,pvalue,systemnum,groupnum) values('cs06',3.2,3,2);
insert into parametertable (pname,pvalue,systemnum,groupnum) values('cs07',0.1,0,0);
insert into parametertable (pname,pvalue,systemnum,groupnum) values('cs08',0.2,0,0);



需要一个存储过程 proc(in systemnum int)

call proc(1) 返回所有第一套系统的所有项目的集合。这里面包括的对象是有要求的,如下:

public class ProjectA {
private int projectid;
private String projectname;
private int systemnum;
private int groupnum;
private double cs;
//此属性比特殊,如果此项目是A系统的第一类(即:groupnum=1)刚对应参数cs01
//如果此项目是A系统的第二类(即:groupnum=2)刚对应参数cs02
private double cs07; //公共的参数
private double cs08; //公共的参数

}


...全文
291 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwwwb 2012-12-21
  • 打赏
  • 举报
回复
DELIMITER $$ USE `hytest`$$ DROP PROCEDURE IF EXISTS `te`$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `te`(aid INT) BEGIN DROP TABLE IF EXISTS TT; SELECT aid; SELECT MAX(LEFT(b.`pname`,6)) INTO @gg FROM `project` a,`parametertable` b WHERE a.`groupnum`=b.`groupnum` AND a.`systemnum`=b.`systemnum` AND a.`systemnum`=aid; SET @asql=CONCAT('SELECT a.*,b.`pvalue` as ',@gg,', d.* FROM `project` a,`parametertable` b ,'); SET @a=''; SELECT @a:=CONCAT(@a,pvalue,' as ',pname,', ') FROM `parametertable` WHERE (`systemnum`=aid AND `groupnum`=0) OR (`systemnum`=0 AND `groupnum`=0); SET @a=CONCAT('(select ',LEFT(@a,CHAR_LENGTH(@a)-2),') d'); SET @asql=CONCAT('CREATE TABLE TT AS ',@asql,@a,' WHERE a.`groupnum`=b.`groupnum` AND a.`systemnum`=b.`systemnum` AND a.`systemnum`=',aid); PREPARE stml FROM @asql; EXECUTE stml; END$$ DELIMITER ; 访问TT表即可
wwwwb 2012-12-21
  • 打赏
  • 举报
回复
取最后1个记录集的内容,OR 生成表,保存最后1个记录集的内容
Ghosthuo 2012-12-21
  • 打赏
  • 举报
回复


运行的时候会产生多个结果集,我对存储过程不是很了解,但之前遇上过这类似的。在程序中只能取到第一个结果集的数据。

还是我对存储过程的调用有问题呢?
wwwwb 2012-12-20
  • 打赏
  • 举报
回复
or DELIMITER $$ DROP PROCEDURE IF EXISTS te$$ CREATE PROCEDURE te(aid INT) BEGIN SELECT aid; SELECT MAX(LEFT(b.`pname`,6)) INTO @gg FROM `project` a,`parametertable` b WHERE a.`groupnum`=b.`groupnum` AND a.`systemnum`=b.`systemnum` AND a.`systemnum`=aid; SET @asql=CONCAT('SELECT a.*,b.`pvalue` as ',@gg,', d.* FROM `project` a,`parametertable` b ,'); SET @a=''; SELECT @a:=CONCAT(@a,pvalue,' as ',pname,', ') FROM `parametertable` WHERE (`systemnum`=aid AND `groupnum`=0) OR (`systemnum`=0 AND `groupnum`=0); SET @a=CONCAT('(select ',LEFT(@a,CHAR_LENGTH(@a)-2),') d'); SET @asql=CONCAT(@asql,@a,' WHERE a.`groupnum`=b.`groupnum` AND a.`systemnum`=b.`systemnum` AND a.`systemnum`=',aid); PREPARE stml FROM @asql; EXECUTE stml; END$$ DELIMITER ; call te(4)
wwwwb 2012-12-20
  • 打赏
  • 举报
回复
@qq为systemnu,自行修改 SET @qq=4; SELECT MAX(LEFT(b.`pname`,6)) INTO @gg FROM `project` a,`parametertable` b WHERE a.`groupnum`=b.`groupnum` AND a.`systemnum`=b.`systemnum` AND a.`systemnum`=@qq; SELECT @gg; SET @asql=CONCAT('SELECT a.*,b.`pvalue` as ',@gg,', d.* FROM `project` a,`parametertable` b ,'); SET @a=''; SELECT @a:=CONCAT(@a,pvalue,' as ',pname,', ') FROM `parametertable` WHERE (`systemnum`=@qq AND `groupnum`=0) OR (`systemnum`=0 AND `groupnum`=0); SET @a=CONCAT('(select ',LEFT(@a,CHAR_LENGTH(@a)-2),') d'); SELECT @a; SET @asql=CONCAT(@asql,@a,' WHERE a.`groupnum`=b.`groupnum` AND a.`systemnum`=b.`systemnum` AND a.`systemnum`=',@qq); SELECT @asql; PREPARE stml FROM @asql; EXECUTE stml;
Ghosthuo 2012-12-20
  • 打赏
  • 举报
回复
参数的systemnum=0时表示各系统公共的属性,groupnum=0时表示各组公共的属性。 我做数据的时候没有注意到。不好意思了。
Ghosthuo 2012-12-20
  • 打赏
  • 举报
回复
是我弄错了,应该有那两项的。
wwwwb 2012-12-20
  • 打赏
  • 举报
回复
`systemnum`=5时,为什么没有 tariff、gasprices这2项?
Ghosthuo 2012-12-20
  • 打赏
  • 举报
回复
输入4 的话结果如下:
wwwwb 2012-12-20
  • 打赏
  • 举报
回复
`systemnum`=5时,为什么没有 tariff、gasprices这2项,4时有?
Ghosthuo 2012-12-20
  • 打赏
  • 举报
回复
数据是跟把systemnum这个值来的。现在库里面系统类的id 已经从4开始了。 A类ID: 4 B类ID: 5
wwwwb 2012-12-20
  • 打赏
  • 举报
回复
用你上传的数据,要求结果是什么,比如systemnum=1
Ghosthuo 2012-12-19
  • 打赏
  • 举报
回复
我试了一下,没有达到想要的效果,感觉原因是在这句:
INNER JOIN parametertable c ON RIGHT(a.projectname,2)=RIGHT(c.pname,2)

给的数据是简化了的,每类系统只有6个项目,结尾都是01\02\03\04\05\06这样统一的。
但实际中系统个数会更多,会出现在ProjecaA11,ProjecaA31,ProjecaA43
贴一下实际project表吧。


还有实际的parametertable表()



各位费心了
yadon_z 2012-12-19
  • 打赏
  • 举报
回复
对于表三中ere和gre这种systemnum和groupnum分别相同的情况表示不会求解.坐等大神吧. 还有就是楼主数据和描述依然有点小出入,不过不影响大局.
WWWWA 2012-12-19
  • 打赏
  • 举报
回复
DELIMITER $$ DROP PROCEDURE IF EXISTS `te`$$ CREATE PROCEDURE `te`(aid INT) BEGIN SET @a=''; SET @c=' INNER JOIN (SELECT pname,`pvalue` AS ' ; SET @d=ASCII('f'); SET @asql1='SELECT A.*,C.`pvalue`,D.CS07,E.CS08,'; SELECT @asql1:=CONCAT(@asql1,CHAR(@d),'.',pname,','), @a:= CONCAT(@a,@c,pname,' FROM parametertable WHERE pname=\'',pname,'\') ',CHAR(@d), ' on 1=1') , @d:=@d+1 FROM parametertable b WHERE b.`groupnum`=0 AND b.`systemnum`=aid; SET @asql=' FROM mysystem a1 INNER JOIN project a ON a1.`systemid`=a.`systemnum` INNER JOIN parametertable c ON RIGHT(a.projectname,2)=RIGHT(c.pname,2) INNER JOIN (SELECT pname,`pvalue` AS CS07 FROM parametertable WHERE pname=\'cs07\') D ON 1=1 INNER JOIN (SELECT pname,`pvalue` AS CS08 FROM parametertable WHERE pname=\'cs08\') E ON 1=1 '; SET @asql=CONCAT(LEFT(@asql1,LENGTH(@asql1)-1),@asql,@a,' WHERE a.`systemnum`=1'); PREPARE stml FROM @asql; EXECUTE stml; END$$ DELIMITER ;
Ghosthuo 2012-12-19
  • 打赏
  • 举报
回复
实际需求是这样,再向参数表里面添加几个参数。

insert into parametertable (pname,pvalue,systemnum,groupnum) values('csA',9.1,1,0);
insert into parametertable (pname,pvalue,systemnum,groupnum) values('csB',9.2,2,0);
insert into parametertable (pname,pvalue,systemnum,groupnum) values('csC',9.3,3,0);
insert into parametertable (pname,pvalue,systemnum,groupnum) values('csC1',9.31,3,0);


这三个参数是特殊的。它们的名子是csA,csB,csC,表示对应三个类系统的。然后关键是groupnum都是0
表示此参数对这类下的所有的组都是有用。
各类系统的参数个数也有可能不同。这样有可能需要三句像楼上给的SQL语句,只是字段不同。
所以数据结果最终是下面这样子的:


WWWWA 2012-12-19
  • 打赏
  • 举报
回复
SELECT A.*,C.`pvalue`,D.CS07,E.CS08 FROM mysystem a1 INNER JOIN project a ON a1.`systemid`=a.`systemnum` INNER JOIN parametertable c ON RIGHT(a.projectname,2)=RIGHT(c.pname,2) INNER JOIN (SELECT pname,`pvalue` AS CS07 FROM parametertable WHERE pname='cs07') D ON 1=1 INNER JOIN (SELECT pname,`pvalue` AS CS08 FROM parametertable WHERE pname='cs08') E ON 1=1 WHERE a.`systemnum`=1;
Ghosthuo 2012-12-19
  • 打赏
  • 举报
回复
引用 8 楼 yadon_z 的回复:
认真看了下楼主的描述,觉得应该不是很难,只是觉得楼主给出的数据和想要的结果貌似不一致.不知道是不是我没理解到.比如楼主结果表中systemnum groupnum 都是1的情况第二条对于cs值为1.2.但是表三中cs 1.2的groupnum又是2..... 不解之下照结果写了一句sql 竟然可以的出结果,

SQL code?1select b.projecti……


楼上理解应该是正确的。
如果我想把公共的参数加到返回结果中应该怎么写呢?如下:
WWWWA 2012-12-19
  • 打赏
  • 举报
回复
projectid=1、2同属于1组,为什么CS不同?
Ghosthuo 2012-12-19
  • 打赏
  • 举报
回复
我整理了一下数据,传到网上了。麻烦下一下吧。这样比描术的更省事儿。

我再简单描述一下吧:




然后我在java中做了三个类,分别对应该A,B,C类系统

public class ProjectA {
private int projectid;
private String projectname;
private int systemnum;
private int groupnum;
private Double xfjz_f;
//(可能是参数表中xfjz_f02,xfjz_f02,xfjz_f03,xfjz_f04,xfjz_f05,xfjz_f06,xfjz_f07中一个的值)
//跟据它所属组决定的
private Double ere;
private Double tariff;
private Double gre;
private Double gasprices;
}


public class ProjectB {
private int projectid;
private String projectname;
private int systemnum;
private int groupnum;
//(可能是参数表中shrs_f01,shrs_f02中一个的值)
//跟据它所属组决定的
private Double shrs_f;
}




public class ProjectC {
private int projectid;
private String projectname;
private int systemnum;
private int groupnum;

private Double xfkz_f1;
private Double xfkz_f2;
private Double xfkz_f3;
private Double xfkz_f4;
private Double xfkz_f5;
private Double erg;
private Double grco2;
private Double grso2;
private Double grno;
private Double grdust;

}








想要返回的结果集:
不管是用sql语句也好,用存储过程也好,参数是系统号,返回这类系统下所有的项目,如果系统下有分组,刚参数按分好的组去取对应该的参数。

图:



数据上传到网上了,地址:http://download.csdn.net/detail/ghosthuo/4906353
新建一库,直接导入就可以了。

加载更多回复(9)

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧