如何在不使用存储过程的情况下编写一个在MySql中运行n次的循环。
这就是我使用存储过程的方式:
DELIMITER $$ DROP PROCEDURE IF EXISTS test$$ CREATE PROCEDURE test() BEGIN DECLARE count INT DEFAULT 0; WHILE count < 10 DO /**Sql statement**/ SET count = count + 1; END WHILE; END$$ DELIMITER ;
然后我以这种方式执行我的过程:
call test();
如果删除存储过程并运行普通查询,则它将失败,并显示以下错误:
1064-您的SQL语法有误;检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在’DECLARE count INT DEFAULT 0附近使用;第2行的计数<10 DO
我一直在互联网上寻找没有运气的解决方案。
根据评论进行编辑:
上面的存储过程完全满足我的要求:它循环10次并执行我的sql语句。现在,我想在不使用存储过程的情况下完成同样的事情。就像是:
DECLARE count INT DEFAULT 0; WHILE count < 10 DO /**Sql statement**/ SET count = count + 1; END WHILE;
关于流控制语句的MySQL文档说:
MySQL支持 在存储程序中 进行流控制的IF,CASE,ITERATE,LEAVE LOOP,WHILE和REPEAT构造。
关于存储程序和视图的文档说:
存储的程序定义包括可以使用复合语句, 循环,条件和声明的变量 的主体。
复合语句语法
本节描述BEGIN … END复合语句以及可在 存储程序 主体中使用的其他语句的语法:存储过程和函数,触发器和事件。 复合语句是可以包含其他块的块;变量,条件处理程序和游标的声明;以及 诸如循环 和条件测试之 类的流控制构造 。
本节描述BEGIN … END复合语句以及可在 存储程序 主体中使用的其他语句的语法:存储过程和函数,触发器和事件。
复合语句是可以包含其他块的块;变量,条件处理程序和游标的声明;以及 诸如循环 和条件测试之 类的流控制构造 。
因此,看起来您只能在存储过程,函数或触发器内运行显式循环。
根据您在SQL语句中所做的操作,使用数字表(或视图)在mysql中创建“数字表”,MYSQL:顺序号表可能是可接受的。
如果您的查询是a,SELECT并且可以将SELECT10倍的结果作为一个长结果集(而不是10个单独的结果集)返回,则可以执行以下操作:
SELECT
SELECT MainQuery.* FROM ( SELECT 1 AS Number UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 ) AS Numbers CROSS JOIN ( SELECT 'some data' AS Result ) AS MainQuery
INSERT的示例
我建议在数据库中有一个永久的数字表。在许多情况下很有用。请参阅上面的链接如何生成它。
因此,如果您有一个表Numbers,该表的int列Number的值从1到100K(例如,我这样做),并且此列上有主键,则可以使用此循环:
Numbers
int
Number
DECLARE count INT DEFAULT 0; WHILE count < 10 DO INSERT INTO table_name(col1,col2,col3) VALUES("val1","val2",count); SET count = count + 1; END WHILE;
你可以写:
INSERT INTO table_name(col1,col2,col3) SELECT ("val1", "val2", Numbers.Number-1) FROM Numbers WHERE Numbers.Number <= 10;
它的工作速度也快将近10倍。