解决方法
这种情况下某些实验很有用(这是在10g上进行的).使用以下查询,我们可以告诉每次调用它们时,将使用相同的参数(在本例中为none)执行正常的函数:
select dbms_random.value() from all_tables
这是因为Oracle假定函数不会一致地返回相同的值,除非您另有说明.我们可以通过使用deterministic关键字创建函数来实现:
CREATE FUNCTION rand_det RETURN NUMBER DETERMINISTIC AS BEGIN RETURN DBMS_RANDOM.VALUE (); END;
在第一个查询中使用此函数而不是dbms_random告诉我们,尽管有很多调用,但查询只执行一次.但这只是澄清了选择部分.如果我们在select和where子句中使用相同的确定性函数,该怎么办?我们可以使用以下查询来测试:
SELECT rand_det FROM all_tables WHERE rand_det > .5;
您可能需要多次运行才能看到我们的证明,但最终,您会看到一个小于0.5的值列表.这为我们提供了证据,即使确定性函数正在被执行两次:它出现的每个部分一次.作为替代,您可以如下修改我们的确定性函数,然后运行后续查询,这将显示写入DBMS_OUTPUT的2行.
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;