MySQL: кажется, что курсор не заканчивается - PullRequest
0 голосов
/ 28 апреля 2018

Я работаю с Aurora / MySQL. У меня есть курсор, который никогда не кажется законченным / завершенным.

Что меня действительно смущает, так это примеры, которые я видел в Интернете, я никогда не видел, чтобы они устанавливали переменную «done» или «finish» в единицу. Ниже мой сценарий.

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()

С какой стати этот курсор хочет работать вечно? Любая помощь с благодарностью.

1 Ответ

0 голосов
/ 28 апреля 2018

Я думаю, что SELECT, которые у меня есть в моем цикле повтора, портят обработчик «Больше строк». Я удалил ПОВТОР и поместил в петлю. Похоже, это работает как очарование, давая мне заявления, которые я ожидаю.

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 $$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...