Могут ли Firebirds SELECT FIRST принять переменную?

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

В руководстве говорится, что FIRST принимает "Любое выражение, вычисляемое в целое число". Разве это не должно означать переменную тоже?

В следующей хранимой процедуре я получаю сообщение об ошибке при попытке :DAYS в FIRST,

Token unknown - line 10, column 18
:

Строка 10, столбец 18 - это : перед ДНЯМИ...

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 ответ

Решение

Вам нужно заключить параметр в скобки, чтобы он работал:

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.

Другие вопросы по тегам