firebird - Firebirds SELECT FIRST 可以接受变量吗?

标签 firebird firebird2.5 firebird2.1

http://www.firebirdsql.org/refdocs/langrefupd20-select.html#langrefupd20-first-skip

手册说 FIRST 接受“任何计算为整数的表达式”。这不也应该意味着一个变量吗?

在以下存储过程中,我在尝试向 FIRST 提供 :DAYS 时遇到错误。

Token unknown - line 10, column 18
:

第10行第18列是DAYS...前面的:

SET TERM ^ ;

CREATE PROCEDURE P_STOCK_MDA 
 ( STOCK BIGINT, TRADE_DATE DATE, DAYS SMALLINT ) 
RETURNS 
 ( AVG_CLOSE NUMERIC(6,2) )
AS 
BEGIN
  SELECT AVG(STOCK_ADJ_CLOSE) FROM (
    SELECT FIRST :DAYS STOCK_ADJ_CLOSE
    FROM STOCK_DAILY yd 
    WHERE yd.STOCK_STOCK=:STOCK AND yd.TRADE_DATE<=:TRADE_DATE
    ORDER BY yd.TRADE_DATE DESC
  ) INTO AVG_CLOSE;
END^

最佳答案

您需要将参数括在括号中才能使其正常工作:

SELECT FIRST (:DAYS) STOCK_ADJ_CLOSE

完整代码:

SET TERM ^ ;

CREATE PROCEDURE P_STOCK_MDA 
 ( STOCK BIGINT, TRADE_DATE DATE, DAYS SMALLINT ) 
RETURNS 
 ( AVG_CLOSE NUMERIC(6,2) )
AS 
BEGIN
  SELECT AVG(STOCK_ADJ_CLOSE) FROM (
    SELECT FIRST (:DAYS) STOCK_ADJ_CLOSE
    FROM STOCK_DAILY yd 
    WHERE yd.STOCK_STOCK=:STOCK AND yd.TRADE_DATE<=:TRADE_DATE
    ORDER BY yd.TRADE_DATE DESC
  ) INTO AVG_CLOSE;
END^

SET TERM ; ^

文档确实说:

If <int-expr> is an integer literal or a query parameter, the “()” may be omitted

但是我认为这仅适用于 ? DSQL 中的查询参数,而不是 PSQL 中的命名参数。

关于firebird - Firebirds SELECT FIRST 可以接受变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17380120/

相关文章:

数据库设计问题——哪个是最好的解决方案?

delphi - 将变体转换为 double 时出错 [Delphi XE + IBObjects 4.9.12]

database - 即使关闭后也无法恢复数据库备份 ("database might be in use")

sql - 为什么索引不与子查询一起使用

sql - Firebird 删除 SELECT LIST 子查询上的重复行

sql - 在 Firebird 中使用 select in group by 语句

c# - ASP.NET 网站在恰好 50 个请求后崩溃

mysql - 如何在 SQL 中裁剪字段长度,使其不占用 DBGrid 的所有空间?

firebird - 列出 firebird 1.5 上的事件语句

sql - 哪个更适合Firebird : decimal or numeric?中的价格计算