MySQL 存储过程语法错误:查找素数

问题描述 投票:0回答:1

我正在尝试在

HackerRank
上执行 MySQL 存储过程,该过程查找小于或等于 1000 的素数并使用分隔符打印它们。但是,我遇到了语法错误,并且不确定是什么原因造成的。这是我的代码:

DELIMITER //

CREATE PROCEDURE findPrimes()
BEGIN
    DECLARE n INT;
    DECLARE divisor INT;
    DECLARE isPrime BOOLEAN;
    
    SET n = 2;
    
    WHILE n <= 1000 DO
        SET divisor = 2;
        SET isPrime = TRUE;
        
        WHILE divisor * divisor <= n DO
            IF n % divisor = 0 THEN
                SET isPrime = FALSE;
                LEAVE;
            END IF;
            SET divisor = divisor + 1;
        END WHILE;
        
        IF isPrime THEN
            SET @result = CONCAT_WS('&', @result, n);
        END IF;
        SET n = n + 1;
    END WHILE;
    SELECT @result;
END;
//
DELIMITER ;

call findPrimes();

我收到以下错误消息:

ERROR 1064 (42000) at line 2: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ';
            END IF;
            SET divisor = divisor + 1;
        END WHILE;
' at line 16

有人可以帮我识别并纠正代码中的语法错误吗?谢谢你。

解决语法错误!

sql mysql syntax-error
1个回答
0
投票

使用公用表表达式更简单:

WITH RECURSIVE
    numbers AS (
        SELECT 2 as n
        UNION ALL
        SELECT n + 1 FROM numbers WHERE n < 1000
    ), 
    primes AS (
        SELECT n
        FROM numbers c
        WHERE NOT EXISTS (
            SELECT n FROM numbers c2 WHERE c.n > c2.n AND MOD(c.n, c2.n) = 0
        )
    )
SELECT REPLACE(GROUP_CONCAT(n), ',', '&') FROM primes
© www.soinside.com 2019 - 2024. All rights reserved.