假设您有以下更新:
Update table set col1 = func(col2) where col1<>func(col2)
该 FUNC 函数为每个行计算两次,每行,或一次?
谢谢,
在这种情况下,有些实验是有用的(对10g进行)。使用以下查询,我们可以知道使用相同参数(在本例中为无参数)的普通函数每次都将被执行:
select dbms_random.value() from all_tables
这是因为Oracle假设一个函数将不会一致地返回相同的值,除非您另有说明。我们可以通过使用deterministic关键字创建一个函数来做到这一点:
deterministic
CREATE FUNCTION rand_det RETURN NUMBER DETERMINISTIC AS BEGIN RETURN DBMS_RANDOM.VALUE (); END;
使用此函数而不是dbms_random在第一个查询中使用该函数可以告诉我们,尽管调用次数很多,但是该查询仅执行一次。但这仅使本select节明确。如果我们在aselect和where子句中使用相同的确定性函数,该怎么办。我们可以使用以下查询进行测试:
dbms_random
select
where
SELECT rand_det FROM all_tables WHERE rand_det > .5;
您可能必须运行几次才能看到我们的证明,但是最终,您将看到小于0.5的值列表。这为我们提供了证据,甚至确定性函数也被执行两次:对于每个出现在其中的部分,执行一次。或者,您可以按如下所示修改我们的确定性函数,然后运行后续查询,这将显示写入到的两行DBMS_OUTPUT。
DBMS_OUTPUT
CREATE OR REPLACE FUNCTION rand_det RETURN NUMBER DETERMINISTIC AS BEGIN DBMS_OUTPUT.put_line ('Called!'); RETURN DBMS_RANDOM.VALUE (); END; SELECT rand_det FROM all_tables;