gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:57:53 26 4
gpt4 key购买 nike

假设您有以下更新:

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

func函数每行两次评估,还是每行一次?

谢谢,

最佳答案

在这种情况下,有些实验是有用的(对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部分。如果我们在 selectwhere子句中使用相同的确定性函数,该怎么办。我们可以使用以下查询进行测试:
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;

关于sql - pl/sql函数调用了多少次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6776366/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com