如何将我的 sql 更改为在 mysql 中的 MySql 存储过程中循环?
How to change my sql to loop in MySql stored procedure in mysql?
当我在每个语句中写下我的 sql 时,它起作用 well.Now 我的 sql 是:
SELECT COUNT(*) INTO v_Point1Num from tbpoint where Point=1;
SELECT COUNT(*) INTO v_Point2Num from tbpoint where Point=2;
SELECT COUNT(*) INTO v_Point3Num from tbpoint where Point=3;
SELECT COUNT(*) INTO v_Point4Num from tbpoint where Point=4;
SELECT COUNT(*) INTO v_Point5Num from tbpoint where Point=5;
而且效果很好。
现在我试着把它改成循环,但它是错误的,如何解决?我想知道这是为什么我没有像“@v”那样使用“@”的原因。
--can not work.
CREATE `SP_Point`()
BEGIN
DECLARE v INT DEFAULT(0);
DECLARE pointlStr VARCHAR(800);
SET v = 1;
WHILE v <= 5 DO
SELECT COUNT(*) INTO
(case v
when 1 then concat('v_Point',v,'Num')
when 2 then concat('v_Point',v,'Num')
when 3 then concat('v_Point',v,'Num')
when 4 then concat('v_Point',v,'Num')
when 5 then concat('v_Point',v,'Num')
)
from tbpoint
where Point=v;
SET v = v + 1;
END WHILE;
END
我试着改成其他方式,还是不对
SET v = 1;
WHILE v <= 5 DO
set pointlStr=
'SELECT COUNT(*) INTO @v_Point'+@v+'Num from tbpoint
where Point='+@v;
prepare stmt from @pointlStr;
execute stmt;
SET v = v + 1;
END WHILE;
您正在尝试在 运行 时间创建一个新变量(v_Point1Num、v_Point2Num...等),这在 mysql 中是不可能的。你必须在使用它之前声明一个变量。
您也可以通过 运行 宁单个查询获得相同的输出......而不是 运行宁多个查询
SELECT Point, COUNT(*) from tbpoint
group by Point
having point > 0 and point <= 5;
Concat() 函数 return varchar/String 不是变量名。仅声明一个变量 "v_pointNum"... 将值提取到循环内的变量中.... 并在同一循环中更新另一个 table 。 –
CREATE `SP_Point`()
BEGIN
DECLARE v INT DEFAULT(0);
-- declare a variable to hold count value
DECLARE v_pointNum INT DEFAULT(0);
DECLARE serviceAttitudeLevelStr VARCHAR(800);
SET v = 1;
WHILE v <= 5 DO
SELECT COUNT(*) INTO v_pointNum from tbpoint where Point=v;
-- update another table
update <mytable> set <mycol> = v_pointNum where <condition>;
SET v = v + 1;
END WHILE;
END
当我在每个语句中写下我的 sql 时,它起作用 well.Now 我的 sql 是:
SELECT COUNT(*) INTO v_Point1Num from tbpoint where Point=1;
SELECT COUNT(*) INTO v_Point2Num from tbpoint where Point=2;
SELECT COUNT(*) INTO v_Point3Num from tbpoint where Point=3;
SELECT COUNT(*) INTO v_Point4Num from tbpoint where Point=4;
SELECT COUNT(*) INTO v_Point5Num from tbpoint where Point=5;
而且效果很好。 现在我试着把它改成循环,但它是错误的,如何解决?我想知道这是为什么我没有像“@v”那样使用“@”的原因。
--can not work.
CREATE `SP_Point`()
BEGIN
DECLARE v INT DEFAULT(0);
DECLARE pointlStr VARCHAR(800);
SET v = 1;
WHILE v <= 5 DO
SELECT COUNT(*) INTO
(case v
when 1 then concat('v_Point',v,'Num')
when 2 then concat('v_Point',v,'Num')
when 3 then concat('v_Point',v,'Num')
when 4 then concat('v_Point',v,'Num')
when 5 then concat('v_Point',v,'Num')
)
from tbpoint
where Point=v;
SET v = v + 1;
END WHILE;
END
我试着改成其他方式,还是不对
SET v = 1;
WHILE v <= 5 DO
set pointlStr=
'SELECT COUNT(*) INTO @v_Point'+@v+'Num from tbpoint
where Point='+@v;
prepare stmt from @pointlStr;
execute stmt;
SET v = v + 1;
END WHILE;
您正在尝试在 运行 时间创建一个新变量(v_Point1Num、v_Point2Num...等),这在 mysql 中是不可能的。你必须在使用它之前声明一个变量。
您也可以通过 运行 宁单个查询获得相同的输出......而不是 运行宁多个查询
SELECT Point, COUNT(*) from tbpoint
group by Point
having point > 0 and point <= 5;
Concat() 函数 return varchar/String 不是变量名。仅声明一个变量 "v_pointNum"... 将值提取到循环内的变量中.... 并在同一循环中更新另一个 table 。 –
CREATE `SP_Point`()
BEGIN
DECLARE v INT DEFAULT(0);
-- declare a variable to hold count value
DECLARE v_pointNum INT DEFAULT(0);
DECLARE serviceAttitudeLevelStr VARCHAR(800);
SET v = 1;
WHILE v <= 5 DO
SELECT COUNT(*) INTO v_pointNum from tbpoint where Point=v;
-- update another table
update <mytable> set <mycol> = v_pointNum where <condition>;
SET v = v + 1;
END WHILE;
END