是否可以将 EXTERNAL FUNCTION 设为常量或不可变,以便 Firebird 知道在一个 SQL 语句的过程中不会重新计算它?
在下面的示例(Firebird 2.1)中,我希望 GETTIMEOFDAY() 的行为类似于 CURRENT_TIMESTAMP,但它会被评估两次:
SQL> DECLARE EXTERNAL FUNCTION gettimeofday -- gettimeofday(2) wrapper
CON> RETURNS DOUBLE PRECISION BY VALUE
CON> ENTRY_POINT 'UDF_gettimeofday' MODULE_NAME 'udf_gettimeofday';
SQL> SELECT CURRENT_TIMESTAMP AS ts,
CON> CAST(GETTIMEOFDAY() AS INTEGER) AS time_t,
CON> FB_SLEEP(2) AS zzz
CON> FROM rdb$database
CON> CROSS JOIN (SELECT 1 AS foo
CON> FROM rdb$database
CON> UNION ALL
CON> SELECT 2
CON> FROM rdb$database) d;
TS TIME_T ZZZ
========================= ============ ============
2011-03-15 20:57:46.0390 1300244268 0
2011-03-15 20:57:46.0390 1300244270 0
如您所见,“TS”的值保持不变,但我的“TIME_T”在 FB_SLEEP() 调用中前进。(FB_SLEEP 是一个方便的函数,可以暂停给定的秒数。)
我想要的可能吗?我知道 PostgreSQL 的STABLE FUNCTIONS概念正是允许这样做的。