一尘不染

pl / sql函数调用了多少次?

sql

假设您有以下更新:

Update table set col1 = func(col2)
where col1<>func(col2)

FUNC 函数为每个行计算两次,每行,或一次?

谢谢,


阅读 130

收藏
2021-05-16

共1个答案

一尘不染

在这种情况下,有些实验是有用的(对10g进行)。使用以下查询,我们可以知道使用相同参数(在本例中为无参数)的普通函数每次都将被执行:

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节明确。如果我们在aselectwhere子句中使用相同的确定性函数,该怎么办。我们可以使用以下查询进行测试:

SELECT rand_det
FROM   all_tables
WHERE  rand_det > .5;

您可能必须运行几次才能看到我们的证明,但是最终,您将看到小于0.5的值列表。这为我们提供了证据,甚至确定性函数也被执行两次:对于每个出现在其中的部分,执行一次。或者,您可以按如下所示修改我们的确定性函数,然后运行后续查询,这将显示写入到的两行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;
2021-05-16