小编典典

循环n次而不使用存储过程

sql

如何在不使用存储过程的情况下编写一个在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;

阅读 131

收藏
2021-04-15

共1个答案

小编典典

关于流控制语句的MySQL文档说:

MySQL支持 在存储程序中 进行流控制的IF,CASE,ITERATE,LEAVE LOOP,WHILE和REPEAT构造。

关于存储程序和视图的文档说:

存储的程序定义包括可以使用复合语句, 循环,条件和声明的变量 的主体。

复合语句语法

本节描述BEGIN … END复合语句以及可在 存储程序 主体中使用的其他语句的语法:存储过程和函数,触发器和事件。

复合语句是可以包含其他块的块;变量,条件处理程序和游标的声明;以及 诸如循环 和条件测试之 类的流控制构造

因此,看起来您只能在存储过程,函数或触发器内运行显式循环。


根据您在SQL语句中所做的操作,使用数字表(或视图)在mysql中创建“数字表”,MYSQL:顺序号表可能是可接受的。

如果您的查询是a,SELECT并且可以将SELECT10倍的结果作为一个长结果集(而不是10个单独的结果集)返回,则可以执行以下操作:

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,该表的intNumber的值从1到100K(例如,我这样做),并且此列上有主键,则可以使用此循环:

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倍。

2021-04-15