Я получаю ошибку при создании хранимой процедуры с циклом while в MySQL - PullRequest
0 голосов
/ 27 мая 2019

я создал одну хранимую процедуру для суммы перикулярного состояния, но получил синтаксическую ошибку.

сценарий создания таблицы:

CREATE TABLE count_smaller_coverage (count_records INT(11) ,block_id INT(11))

вставка данных:

INSERT INTO count_smaller_coverage 
SELECT '114000','1' UNION
SELECT '112000','2' UNION 
SELECT '98765','3' UNION 
SELECT '78965','4' UNION 
SELECT '4125','5' UNION 
SELECT '123654','6' UNION 
SELECT '78999','7' UNION 
SELECT '89888','8' UNION 
SELECT '99654','9' UNION 
SELECT '75365','10' UNION 
SELECT '25638','11' UNION 
SELECT '85236','12' UNION 
SELECT '65478','13' UNION 
SELECT '65478','14' UNION 
SELECT '85236','15' 

Хранимая процедура:

DELIMITER $$
DROP PROCEDURE IF EXISTS test_mysql_while_loop$$
CREATE PROCEDURE test_mysql_while_loop()
BEGIN
DECLARE strat INT;
DECLARE END INT;
DECLARE SumofCount BIGINT;
DECLARE block_id VARCHAR(2000);
SET strat=(SELECT MIN(block_id) FROM count_smaller_coverage);
SET END =(SELECT MAX(block_id) FROM count_smaller_coverage);
CREATE TABLE blocks_parts (block_id VARCHAR(2000), Counts BIGINT);

test: WHILE strat<=END DO

BEGIN

IF SumofCount > 800000 THEN
SET SumofCount=0;
SET block_id = NULL;
END IF;

SET SumofCount=COALESCE(SumofCount,0)+(SELECT count_records FROM count_smaller_coverage WHERE block_id=strat);
SELECT block_id = (COALESCE(block_id + ',', '') + CAST(block_id AS CHAR)) AS id FROM count_smaller_coverage WHERE block_id=strat;

IF SumofCount BETWEEN 800000 AND 1000000 THEN
INSERT INTO blocks_parts(block_id,Counts) VALUES (block_id,SumofCount);
END IF;

IF SumofCount BETWEEN 800000 AND 100000 THEN
    LEAVE test;
END IF;

SET strat=strat+1;

END test;
END$$
DELIMITER ;

Ошибка:

Запрос: CREATE PROCEDURE test_mysql_ while_loop () BEGIN DECLARE strat INT;ОБЪЯВИТЬ end INT;ОБЪЯВИТЬ SumofCount BIGINT;ОБЪЯВИТЬ block_id V ...

Код ошибки: 1064 В синтаксисе SQL есть ошибка;проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с 'test';END 'в строке 33

Время выполнения: 0 с Время передачи: 0 с Общее время: 0,060 с

Ответы [ 2 ]

0 голосов
/ 27 мая 2019
DELIMITER $$

USE `test`$$

DROP PROCEDURE IF EXISTS `Test`$$

CREATE DEFINER=`root`@`%` PROCEDURE `Test`()

BEGIN

SET @SumofCount=0;
SET @block_id='';
SET @Start=(SELECT MIN(block_id) FROM count_smaller_coverage);
SET @End =(SELECT MAX(block_id) FROM count_smaller_coverage);
SET @v1=5;

myloop: WHILE @Start<=@End DO
IF @SumofCount > 800000 THEN
SET @SumofCount=0;
END IF;
SET @SumofCount=(IFNULL(@SumofCount,0)+(SELECT count_records FROM count_smaller_coverage WHERE block_id=@Start));
SET @block_id = (SELECT CONCAT(@block_id ,CAST(block_id AS CHAR),',') AS id FROM count_smaller_coverage WHERE block_id=@Start);

IF @SumofCount BETWEEN 800000 AND 1000000 THEN
SET @block_id = CONCAT(LEFT(@block_id, CHAR_LENGTH(@block_id) -1), '');
INSERT INTO blocks_parts(block_id,Counts) VALUES (@block_id,@SumofCount);
SET @block_id='';
END IF;
IF @Start = @End THEN
SET @block_id = CONCAT(LEFT(@block_id, CHAR_LENGTH(@block_id) -1), '');
INSERT INTO blocks_parts(block_id,Counts) VALUES (@block_id,@SumofCount);
END IF;

SET @Start=@Start+1;

END WHILE myloop;



    END$$

DELIMITER ;
0 голосов
/ 27 мая 2019

У вас есть пара проблем в вашей процедуре.Во-первых, у вас есть лишний BEGIN после DO в вашем WHILE утверждении.Вы можете либо удалить это, либо сопоставить его с END.Во-вторых, вам нужно завершить цикл WHILE знаком END WHILE, в вашем случае добавить метку test к этому выражению.Это должно работать:

test: WHILE strat<=END DO
    -- BEGIN -- if you put BEGIN here ...
    IF SumofCount > 800000 THEN
    SET SumofCount=0;
    SET block_id = NULL;
    END IF;

    SET SumofCount=COALESCE(SumofCount,0)+(SELECT count_records FROM count_smaller_coverage WHERE block_id=strat);
    SELECT block_id = (COALESCE(block_id + ',', '') + CAST(block_id AS CHAR)) AS id FROM count_smaller_coverage WHERE block_id=strat;

    IF SumofCount BETWEEN 800000 AND 1000000 THEN
    INSERT INTO blocks_parts(block_id,Counts) VALUES (block_id,SumofCount);
    END IF;

    IF SumofCount BETWEEN 800000 AND 100000 THEN
        LEAVE test;
    END IF;

    SET strat=strat+1;
    -- END -- ... you must put END here
END WHILE test;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...