【问题标题】:How can I pass parameter to stored procedure through a query?如何通过查询将参数传递给存储过程?
【发布时间】: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


【解决方案1】:
SELECT id into @id FROM Users LIMIT 1;
CALL test(@vote_value, @score, @id, 'WEEK');

试试上面的代码。

如上所述,您可以使用 SELECT id into @id 获得该 id 的值,然后将该 @id 用作该查询的参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    相关资源
    最近更新 更多