【问题标题】:Parameterize mySQL Stored Procedure参数化 mySQL 存储过程
【发布时间】:2020-11-14 22:35:43
【问题描述】:

我有以下 mySQL (v5.7) 存储过程,效果很好(它计算最近 2​​5 行的平均值):

CREATE DEFINER=`SqueezeOJ`@`%` PROCEDURE `NVG_SMA25`(
    IN  myDate DATE,
    OUT mySMA25 DECIMAL(8,2)
)
BEGIN
    SELECT ROUND(AVG(ClosingPrice), 2) INTO mySMA25 FROM NVG
    WHERE TradeDate IN (SELECT * FROM (SELECT DISTINCT TradeDate 
                          FROM NVG 
                         WHERE TradeDate <= myDate
                         ORDER BY TradeDate DESC LIMIT 25) as calculating);
END

我想将 LIMIT 25 参数化为 LIMIT X - 我可以将 X 传递到过程中,但我尝试的一切都会导致错误。

有人能指出正确的方向吗?

谢谢,杰森

【问题讨论】:

  • 你不能参数化它。 SQL 语法需要一个文字数字。在大多数情况下,程序是多余的,尤其是像这样的微不足道的程序。以后版本mysql或mariadb版本中的窗口函数让这个查询更容易
  • 这里没有任何“程序”,所以为什么不简单地使用查询
  • 也许有更好的方法?基本上,我每晚都在下载股票价格,然后计算它们的几个移动平均线(25、50、100)。我希望能够参数化股票表的名称以及运行移动平均线的时间长度。我完全愿意接受建议。谢谢!

标签: mysql stored-procedures parameters


【解决方案1】:

13.2.9 SELECT Statement

...

  • LIMIT 子句可用于限制返回的行数 通过 SELECT 语句。 LIMIT 接受一个或两个数字参数, 必须都是非负整数常量,这些 例外:

    • 在准备好的语句中,LIMIT 参数可以使用?占位符标记。

    • 在存储程序中,可以使用整数值的例程参数或局部变量来指定 LIMIT 参数。

...

dbfiddle

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-21
  • 2015-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多