我认为通常不会这样,因为它会阻止使用索引.
至少对于内置函数,Oracle应该能够确定它只能评估一次. (对于用户定义的函数,请参见下文).
这是一个使用索引的情况(并且不对每一行评估函数):
SQL> select id from tbl_table where id > to_char(sysdate, 'YYYY');
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 35 | 140 | 1 (0)| 00:00:01 |
|* 1 | INDEX RANGE SCAN| SYS_C004274 | 35 | 140 | 1 (0)| 00:00:01 |
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("ID">TO_NUMBER(TO_CHAR(SYSDATE@!,'YYYY')))
对于用户定义的功能,请查看此article.它提到了两种确保方法
您的函数只被调用一次:
>从Oracle 10.2开始,您可以将函数定义为DETERMINISTIC.
>在旧版本中,您可以重新使用它来使用“标量子查询缓存”:
SELECT COUNT(*) 来自员工 WHERE SALARY =(SELECT getValue(1)FROM DUAL);