mysql存储过程请教?
类似于游标嵌套
想写如下存储过程,但有些问题不能解决?
是关于教学问卷调查数据的统计的,每个班级每个学科有三个选项(A、B、C),统计每个班级每个学科中A、B、C各自所占的比例
BEGIN
declare className varchar(8); declare ifExistClass varchar(8); declare selectA int(3); declare selectB int(3); declare selectC int(3); declare total int(3);
declare stop int default 0;
--从问卷调查表中统计所有班级的一个学科的A、B、C数量
declare CUR_subject CURSOR FOR select QUESTION_RESULT_DETAILS_CLASS,sum(case when YUWEN= 'A' then 1 else 0 end)YUWENA,sum(case when YUWEN = 'B' then 1 else 0 end)YUWENB,sum(case when YUWEN='C' then 1 else 0 end)YUWENC from question_result_details where QUESTION_CONTENT_ID ='15' group by QUESTION_RESULT_DETAILS_CLASS;
--这句是参考网上,用于循环结束的,但暂时没有使用
declare CONTINUE HANDLER FOR SQLSTATE '02000' SET stop=1;
OPEN CUR_subject;
--循环读取,先取出一个班级一个学科的A、B、C数量
fetch CUR_subject into className, selectA, selectB, selectC ;
??这时需要用这个班级名去读取另外一个表(统计结果表),看是否存在该班级的统计信息,如果存在则更新,如果不存在则插入。
??这里有问题,但不知这里怎么来处理。想另外用一个游标,但提示不能这样。
declare CUR_class CURSOR FOR select CLASSNAME from QUESTION_RESULT_STAT where CLASSNAME = className;
fetch CUR_class into ifExistClass;
if ifExistClass NOT NULL then
update QUESTION_RESULT_STAT set YUWENA=selectA, YUWENB=selectB, YUWENC=selectC where CLASSNAME = className;
else
insert into QUESTION_RESULT_STAT values(className,selectA,selectB,selectC);
end if;
CLOSE CUR_subject;
END
不知这样描述清楚了不,还望指教!
[ 本帖最后由 yqlyd 于 2011-5-11 17:16 编辑 ]
想写如下存储过程,但有些问题不能解决?
是关于教学问卷调查数据的统计的,每个班级每个学科有三个选项(A、B、C),统计每个班级每个学科中A、B、C各自所占的比例
BEGIN
declare className varchar(8); declare ifExistClass varchar(8); declare selectA int(3); declare selectB int(3); declare selectC int(3); declare total int(3);
declare stop int default 0;
--从问卷调查表中统计所有班级的一个学科的A、B、C数量
declare CUR_subject CURSOR FOR select QUESTION_RESULT_DETAILS_CLASS,sum(case when YUWEN= 'A' then 1 else 0 end)YUWENA,sum(case when YUWEN = 'B' then 1 else 0 end)YUWENB,sum(case when YUWEN='C' then 1 else 0 end)YUWENC from question_result_details where QUESTION_CONTENT_ID ='15' group by QUESTION_RESULT_DETAILS_CLASS;
--这句是参考网上,用于循环结束的,但暂时没有使用
declare CONTINUE HANDLER FOR SQLSTATE '02000' SET stop=1;
OPEN CUR_subject;
--循环读取,先取出一个班级一个学科的A、B、C数量
fetch CUR_subject into className, selectA, selectB, selectC ;
??这时需要用这个班级名去读取另外一个表(统计结果表),看是否存在该班级的统计信息,如果存在则更新,如果不存在则插入。
??这里有问题,但不知这里怎么来处理。想另外用一个游标,但提示不能这样。
declare CUR_class CURSOR FOR select CLASSNAME from QUESTION_RESULT_STAT where CLASSNAME = className;
fetch CUR_class into ifExistClass;
if ifExistClass NOT NULL then
update QUESTION_RESULT_STAT set YUWENA=selectA, YUWENB=selectB, YUWENC=selectC where CLASSNAME = className;
else
insert into QUESTION_RESULT_STAT values(className,selectA,selectB,selectC);
end if;
CLOSE CUR_subject;
END
不知这样描述清楚了不,还望指教!
[ 本帖最后由 yqlyd 于 2011-5-11 17:16 编辑 ]
作者: yqlyd 发布时间: 2011-05-11
declare CUR_class CURSOR FOR select CLASSNAME from QUESTION_RESULT_STAT where CLASSNAME = className;
fetch CUR_class into ifExistClass;
这个地方就没必要使用游标了....
DECLARE ifExistClass TINYINT DEFAULT 0;
SELECT
CASE WHEN CLASSNAME IS NULL THEN 0
ELSE 1 END AS class_flag from QUESTION_RESULT_STAT where CLASSNAME = className INTO ifExistClass;
fetch CUR_class into ifExistClass;
这个地方就没必要使用游标了....
DECLARE ifExistClass TINYINT DEFAULT 0;
SELECT
CASE WHEN CLASSNAME IS NULL THEN 0
ELSE 1 END AS class_flag from QUESTION_RESULT_STAT where CLASSNAME = className INTO ifExistClass;
作者: jinguanding 发布时间: 2011-05-11