我正在尝试在
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
有人可以帮我识别并纠正代码中的语法错误吗?谢谢你。
解决语法错误!
使用公用表表达式更简单:
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