再看文章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 () ;
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语句了