再看文章http://blog.csdn.net/testcs_dn/article/details/49847299时,有不明白的地方?
比如其中的方法三,代码如下:
第47行和53行标注了不明白的地方,两个问题:
第一:WHILE;
第二:PREPARE stmt
DROP PROCEDURE
IF EXISTS sp_score;
DELIMITER &&CREATE PROCEDURE sp_score ()
BEGIN
#课程名称
DECLARE
cname_n VARCHAR (20) ; #所有课程数量
DECLARE
count INT ; #计数器
DECLARE
i INT DEFAULT 0 ; #拼接SQL字符串
SET @s = 'SELECT sname' ;
SET count = (
SELECT
COUNT(DISTINCT cname)
FROM
stdscore
) ;
WHILE i < count DO
SET cname_n = (
SELECT
cname
FROM
stdscore
GROUP BY CNAME
LIMIT i,
1
) ;
SET @s = CONCAT(
@s,
', SUM(CASE cname WHEN ',
'\'',
cname_n,
'\'',
' THEN score ELSE 0 END)',
' AS ',
'\'',
cname_n,
'\''
) ;
SET i = i + 1 ;
END
WHILE ; #WHILE后可以什么都没有就直接分号?和下边的代码组合,什么意思?
SET @s = CONCAT(
@s,
' FROM stdscore GROUP BY sname'
) ; #用于调试
#SELECT @s;
PREPARE stmt #不懂PREPARE stmt的用法?
FROM
@s ; EXECUTE stmt ;
END&&CALL sp_score () ;
比如其中的方法三,代码如下:
第47行和53行标注了不明白的地方,两个问题:
第一:WHILE;
第二:PREPARE stmt
DROP PROCEDURE
IF EXISTS sp_score;
DELIMITER &&CREATE PROCEDURE sp_score ()
BEGIN
#课程名称
DECLARE
cname_n VARCHAR (20) ; #所有课程数量
DECLARE
count INT ; #计数器
DECLARE
i INT DEFAULT 0 ; #拼接SQL字符串
SET @s = 'SELECT sname' ;
SET count = (
SELECT
COUNT(DISTINCT cname)
FROM
stdscore
) ;
WHILE i < count DO
SET cname_n = (
SELECT
cname
FROM
stdscore
GROUP BY CNAME
LIMIT i,
1
) ;
SET @s = CONCAT(
@s,
', SUM(CASE cname WHEN ',
'\'',
cname_n,
'\'',
' THEN score ELSE 0 END)',
' AS ',
'\'',
cname_n,
'\''
) ;
SET i = i + 1 ;
END
WHILE ; #WHILE后可以什么都没有就直接分号?和下边的代码组合,什么意思?
SET @s = CONCAT(
@s,
' FROM stdscore GROUP BY sname'
) ; #用于调试
#SELECT @s;
PREPARE stmt #不懂PREPARE stmt的用法?
FROM
@s ; EXECUTE stmt ;
END&&CALL sp_score () ;
解决方案 »
- mysql-mmm 虚拟IP怎么配
- mysq服务无法启动
- 设计一个MYSQL的篮球比赛系统 关于划分范式的问题
- 大家都用那个版本的MYSQL以及MYSQL的升级问题
- 急,mysql_fetch_fields()的问题,请大家帮帮忙。
- 关于image类型的问题
- 请教各位,如何启动mysql?
- postgresql+java的中文问题???
- 求两个表不同字段联合查询语句
- mysql_stmt_send_long_data 能支持update语句吗?
- 按服务单号分组。显示出每组中时间最大的。网上的子查询什么的达不到效果。。
- MySQL5.7 修改 root 用户 host 报错:Operation RENAME USER failed for 'root'@'localhost'
53 PREPARE是拼接sql,讲之前的字符串作为sql处理。
Thanks!
第37行的 cname_n 不也是一个变量吗?为什么53行的 PREPARE stmt FROM @s 后不加上@cname_n变量?
难道是因为cname_n前面没有@符号?是否PREPARE stmt FROM后只跟带@符号的变量?如果在13行后用declare声明一个局部变量DECLARE s VARCHAR (20) ;
那么以下所有的@s是不是都可以换成s了呢?PREPARE stmt FROM后如果只跟带@符号的变量,那么岂不是不用PREPARE stmt FROM语句了