我们有很多复杂的SQL代码,当它们在HeidiSQL和MySQL WB中运行时会不断掉落。如果我们使用较少的记录运行相同的代码,则运行良好。
我们认为,如果在SP中创建一个循环,将代码有效地分成10到20次运行,则该循环可能会成功完成。我认为这可能涉及创建10到20个表,稍后将它们合并为一个表。

尝试在较小的数据集上运行,运行良好。尝试增加服务器RAM和磁盘空间。尝试以多种不同方式修改代码。

我意识到这可能不是理想的解决方案,但是有人要求这样做。如果有人可以帮助我编写代码,我将不胜感激。

下面是我构建的代码,但是不起作用...

DELIMITER $$
 DROP PROCEDURE IF EXISTS test_mysql_while_loop$$
 CREATE PROCEDURE test_mysql_while_loop()
 BEGIN
 DECLARE x  INT;

 SET x = 100;

 WHILE x  <= 2000 DO

   DROP TABLE if EXISTS tablex; /* want to end up with table100-table2000 */

   CREATE TABLE tablex AS (
   SELECT t1.*
    FROM bigtables t1
    WHERE urn BETWEEN x AND x+101); /* select records where the URN is between 100 and 201 in 1st instance , 200 and 301 in second etc*/

    SET x=x+100;

 END WHILE;

 END$$
DELIMITER ;

CALL test_mysql_while_loop();


20桌

最佳答案

这是有关如何准备和执行语句的简化示例

 DROP PROCEDURE IF EXISTS p;
 delimiter $$
 CREATE PROCEDURE p()
 BEGIN
 DECLARE x  INT;

 SET x = 100;

 WHILE x  <= 300 DO

   set @sql= (select concat('DROP TABLE if EXISTS table',x));

   select @sql;
   prepare sqlstmt from @sql;
   execute sqlstmt;
   deallocate prepare sqlstmt;

   set @sql = (select concat('CREATE TABLE table',x,' AS
   SELECT t1.*
    FROM users t1;'));

    select @sql;
   prepare sqlstmt from @sql;
   execute sqlstmt;
   deallocate prepare sqlstmt;

     SET x=x+100;

 END WHILE;

 END$$
DELIMITER ;

CALL p();

10-06 14:07
查看更多