AFAIK, вы не можете пометить UDF как постоянную или неизменяемую в Firebird, но в качестве обходного пути вы можете полагаться на встроенное представление (или производную таблицу) для достижения желаемого: выберите значение только один раз и используйте его как константа в ваших результатах. У меня нет UDF под рукой, чтобы сделать тест, так что, возможно, какая-то синтаксическая ошибка, но я надеюсь, что вы поймете идею, стоящую за этим:
SELECT CURRENT_TIMESTAMP AS ts,
q1.time_t,
FB_SLEEP(2) AS zzz
FROM rdb$database
CROSS JOIN (select CAST(GETTIMEOFDAY() AS INTEGER) AS time_t from rdb$database)
CROSS JOIN (SELECT 1 AS foo
FROM rdb$database
UNION ALL
SELECT 2
FROM rdb$database) d;
Вы также можете положиться на выбираемую хранимую процедуру для однократного запуска udf и добавления столбца к результатам данного запроса
Редактировать По запросу, я включаю хранимую процедуру:
SET TERM ^ ;
CREATE PROCEDURE ExampleSP
RETURNS
(
ts timestamp
, time_t integer
, zzz integer
)
as
BEGIN
SELECT CAST(GetTimeOfDay() AS Integer)
FROM rdb$database
INTO :time_t;
for SELECT Current_Timestamp AS ts,
FB_SLEEP(2) AS zzz
FROM rdb$database
CROSS JOIN (SELECT 1 AS foo
FROM rdb$database
UNION ALL
SELECT 2
FROM rdb$database) d
INTO :ts, :zzz do
SUSPEND;
END
^
SET TERM ; ^
SELECT * FROM ExampleSP;