MySQL: 光标似乎永远不会结束
MySQL: Cursor doesn't seem to ever end
我正在与 Aurora/MySQL 合作。我有一个光标,它似乎从来没有 finish/complete。
真正让我困惑的是我在网上看到的示例,我从未看到它们将 "done" 或 "finish" 变量设置为 1。下面是我的脚本。
DELIMITER $$
DROP PROCEDURE IF EXISTS mass_backup $$
CREATE PROCEDURE mass_backup ()
BEGIN
DECLARE copy_table VARCHAR(255);
DECLARE done BOOLEAN DEFAULT 0;
DECLARE table_cursor CURSOR FOR
SELECT table_name FROM information_schema.tables WHERE table_schema='app_prod_schema';
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
OPEN table_cursor;
REPEAT
FETCH table_cursor INTO copy_table;
SELECT copy_table;
SET @var1 = copy_table;
SET @copySql = CONCAT('SELECT * FROM ',@var1,' INTO OUTFILE S3 ''''s3://somebucket.com-work-bucket/''', @var1 ,
'.csv', 'FIELDS TERMINATED BY '','' LINES TERMINATED BY ''\n''' );
SELECT @copySql;
UNTIL done END REPEAT;
CLOSE table_cursor;
END $$
DELIMITER ;
CALL mass_backup()
为什么这个光标要永远运行?非常感谢任何帮助。
我认为我在重复循环中的 SELECT 正在弄乱 "No more rows" 处理程序。我删除了 REPEAT 并放入一个循环。这似乎很有魅力,可以提供我期望的陈述。
DELIMITER $$
DROP PROCEDURE IF EXISTS mass_backup $$
CREATE PROCEDURE mass_backup ()
BEGIN
DECLARE copy_table VARCHAR(255);
DECLARE done BOOLEAN DEFAULT 0;
DECLARE table_cursor CURSOR FOR
SELECT table_name FROM information_schema.tables WHERE table_schema='app_prod_schema' ORDER BY table_name;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
DROP TEMPORARY TABLE IF EXISTS stmtsTable;
CREATE TEMPORARY TABLE stmtsTable (backupStmt varchar(200));
OPEN table_cursor;
curloop:
LOOP
FETCH table_cursor INTO copy_table;
IF done THEN
LEAVE curloop;
END IF;
#SELECT copy_table;
SET @var1 = copy_table;
SET @copySql = CONCAT('SELECT * FROM ',@var1,' INTO OUTFILE S3 \'s3://somebucket/dbbackups/', @var1 ,
'.csv\'', ' FIELDS TERMINATED BY \',\' LINES TERMINATED BY \'\n\'' );
INSERT INTO stmtsTable(backupStmt)
SELECT @copySql;
END LOOP;
CLOSE table_cursor;
SELECT * FROM stmtsTable;
END $$
我正在与 Aurora/MySQL 合作。我有一个光标,它似乎从来没有 finish/complete。
真正让我困惑的是我在网上看到的示例,我从未看到它们将 "done" 或 "finish" 变量设置为 1。下面是我的脚本。
DELIMITER $$
DROP PROCEDURE IF EXISTS mass_backup $$
CREATE PROCEDURE mass_backup ()
BEGIN
DECLARE copy_table VARCHAR(255);
DECLARE done BOOLEAN DEFAULT 0;
DECLARE table_cursor CURSOR FOR
SELECT table_name FROM information_schema.tables WHERE table_schema='app_prod_schema';
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
OPEN table_cursor;
REPEAT
FETCH table_cursor INTO copy_table;
SELECT copy_table;
SET @var1 = copy_table;
SET @copySql = CONCAT('SELECT * FROM ',@var1,' INTO OUTFILE S3 ''''s3://somebucket.com-work-bucket/''', @var1 ,
'.csv', 'FIELDS TERMINATED BY '','' LINES TERMINATED BY ''\n''' );
SELECT @copySql;
UNTIL done END REPEAT;
CLOSE table_cursor;
END $$
DELIMITER ;
CALL mass_backup()
为什么这个光标要永远运行?非常感谢任何帮助。
我认为我在重复循环中的 SELECT 正在弄乱 "No more rows" 处理程序。我删除了 REPEAT 并放入一个循环。这似乎很有魅力,可以提供我期望的陈述。
DELIMITER $$
DROP PROCEDURE IF EXISTS mass_backup $$
CREATE PROCEDURE mass_backup ()
BEGIN
DECLARE copy_table VARCHAR(255);
DECLARE done BOOLEAN DEFAULT 0;
DECLARE table_cursor CURSOR FOR
SELECT table_name FROM information_schema.tables WHERE table_schema='app_prod_schema' ORDER BY table_name;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
DROP TEMPORARY TABLE IF EXISTS stmtsTable;
CREATE TEMPORARY TABLE stmtsTable (backupStmt varchar(200));
OPEN table_cursor;
curloop:
LOOP
FETCH table_cursor INTO copy_table;
IF done THEN
LEAVE curloop;
END IF;
#SELECT copy_table;
SET @var1 = copy_table;
SET @copySql = CONCAT('SELECT * FROM ',@var1,' INTO OUTFILE S3 \'s3://somebucket/dbbackups/', @var1 ,
'.csv\'', ' FIELDS TERMINATED BY \',\' LINES TERMINATED BY \'\n\'' );
INSERT INTO stmtsTable(backupStmt)
SELECT @copySql;
END LOOP;
CLOSE table_cursor;
SELECT * FROM stmtsTable;
END $$