Могут ли 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.