我们有很多复杂的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();