【发布时间】:2017-12-29 13:50:02
【问题描述】:
我有这个存储过程:
CREATE PROCEDURE `test`(OUT `vote_value` INT, OUT `score` INT, IN `user_id` INT, IN `time_range` INT)
NO SQL
BEGIN
SELECT coalesce(sum(vote_value), 0), coalesce(sum(score), 0)
INTO vote_value, score
FROM reputations
WHERE owner_id = user_id
AND date_time > CASE time_range
WHEN 'WEEK'
THEN unix_timestamp(DATE_SUB(now(), INTERVAL 1 WEEK))
WHEN 'MONTH'
THEN unix_timestamp(DATE_SUB(now(), INTERVAL 1 MONTH))
WHEN 'YEAR'
THEN unix_timestamp(DATE_SUB(now(), INTERVAL 1 YEAR))
ELSE 1 END;
END
如您所见,我的程序有 4 个参数。 vote_value 和 score 都有 OUT 方向(作为结果),user_id 和 time_range 都有 IN 方向。所以我在调用过程时必须通过具有IN 方向的那两个。
好的,我可以这样调用程序:
CALL test(@vote_value, @score, 10, 'WEEK');
SELECT @vote_value, @score;
它也会起作用。但请注意第三个参数10。我不想手动手动传递它。我希望它是来自查询的值。像这样的:
CALL test(@vote_value, @score, u.id, 'WEEK');
SELECT id, @vote_value, @score FROM Users u;
但它会引发语法错误。有人知道我该怎么做吗?预期结果为this。
【问题讨论】:
-
为什么不将您的
Procecure重写为Function。Function可以在Select语句中调用 -
@Charlesliam 因为函数在 mysql 中只返回一个值。
-
不是很好的建议。将程序分成 2 个函数就可以了
标签: mysql sql stored-procedures parameter-passing