我有这样的功能:
DROP FUNCTION IF EXISTS user_repo //
CREATE FUNCTION user_repo(user_id INT) RETURNS VARCHAR(20)
BEGIN
DECLARE vote_value mediumint;
DECLARE score mediumint;
SELECT coalesce(sum(r.vote_value), 0), coalesce(sum(r.score), 0)
INTO vote_value, score
FROM reputations
WHERE owner_id = user_id
AND date_time > unix_timestamp(DATE_SUB(now(), INTERVAL 1 WEEK));
RETURN CONCAT_WS(',', vote_value, score);
END;//
它也有效。现在我还想将另一个参数传递给函数以确定时间范围。我的意思是我想传递一个字符串而不是 WEEK
. 这是我的新功能:
DROP FUNCTION IF EXISTS user_repo //
CREATE FUNCTION user_repo(user_id INT, range VARCHAR(10)) RETURNS VARCHAR(20)
BEGIN
DECLARE vote_value mediumint;
DECLARE score mediumint;
SELECT coalesce(sum(r.vote_value), 0), coalesce(sum(r.score), 0)
INTO vote_value, score
FROM reputations
WHERE owner_id = user_id
AND date_time > unix_timestamp(DATE_SUB(now(), INTERVAL 1 range));
RETURN CONCAT_WS(',', vote_value, score);
END;//
但它抛出这个错误:
以下查询失败:
CREATE DEFINER=`root`@`localhost` FUNCTION `user_repo`(`user_id` INT,
`range` VARCHAR(10) CHARSET utf8)
RETURNS VARCHAR(20) CHARSET utf8mb4
NOT DETERMINISTIC
CONTAINS SQL SQL
SECURITY DEFINER
BEGIN DECLARE vote_value mediumint;
DECLARE score mediumint;
SELECT coalesce(sum(r.vote_value), 0), coalesce(sum(r.score), 0)
INTO vote_value, score
FROM reputations
WHERE owner_id = user_id
AND date_time > unix_timestamp(DATE_SUB(now(), INTERVAL 1 range));
RETURN CONCAT_WS(', ', vote_value, score);
END
MySQL 说:#1064 - 你的 SQL 语法有错误;查看与您的 MariaDB 服务器版本对应的手册,了解在 'range) 附近使用的正确语法);返回 CONCAT_WS(',', vote_value, score); 在第 9 行结束'
有人有什么问题吗?
查询的某些部分不能像那样被替换。这些部分包括表名和关键字。“WEEK”属于这一类。反而...
(这可能比某些 IF..THEN..ELSE 或 CASE..WHEN 结构更有效。)