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

解决方案 »

  1.   

    47 while是21行的while do 的结束语,end while 应该放在一起看
    53 PREPARE是拼接sql,讲之前的字符串作为sql处理。
      

  2.   


    Thanks!
      

  3.   

    不过我还有一个问题:
    第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语句了