Firebirds SELECT FIRST 可以接受变量吗?

jca*_*314 2 sql firebird

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

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

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

Token unknown - line 10, column 18
:
Run Code Online (Sandbox Code Playgroud)

第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^
Run Code Online (Sandbox Code Playgroud)

Mar*_*eel 5

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

\n\n
SELECT FIRST (:DAYS) STOCK_ADJ_CLOSE\n
Run Code Online (Sandbox Code Playgroud)\n\n

完整代码:

\n\n
SET TERM ^ ;\n\nCREATE PROCEDURE P_STOCK_MDA \n ( STOCK BIGINT, TRADE_DATE DATE, DAYS SMALLINT ) \nRETURNS \n ( AVG_CLOSE NUMERIC(6,2) )\nAS \nBEGIN\n  SELECT AVG(STOCK_ADJ_CLOSE) FROM (\n    SELECT FIRST (:DAYS) STOCK_ADJ_CLOSE\n    FROM STOCK_DAILY yd \n    WHERE yd.STOCK_STOCK=:STOCK AND yd.TRADE_DATE<=:TRADE_DATE\n    ORDER BY yd.TRADE_DATE DESC\n  ) INTO AVG_CLOSE;\nEND^\n\nSET TERM ; ^\n
Run Code Online (Sandbox Code Playgroud)\n\n

该文档确实说:

\n\n
\n

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

\n
\n\n

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

\n