Firebirds SELECT FIRST可以接受变量吗?

时间:2013-06-29 12:21:08

标签: firebird firebird2.5 firebird2.1

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

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

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

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^

1 个答案:

答案 0 :(得分:3)

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

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 ; ^

文档确实说:

  

如果<int-expr>是整数文字或查询参数,则可以省略“()

但是我假设这只适用于DSQL中的?查询参数,而不适用于PSQL中的命名参数。