加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2021-03-05 11:05:40 所属栏目:MsSql教程 来源:网络整理
导读:假设您有以下更新: Update table set col1 = func(col2)where col1func(col2) func函数每行评估两次,或每行评估一次? 谢谢, 解决方法 这种情况下某些实验很有用(这是在10g上进行的).使用以下查询,我们可以告诉每次调用它们时,将使用相同的参数(在本例中

假设您有以下更新:

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

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

谢谢,

解决方法

这种情况下某些实验很有用(这是在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;

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读