暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 使用SLE_Cache和RELIES_ON执行函数...系统日期?

askTom 2015-11-09
172

问题描述

Hi-我对使用函数的一般理解是,如果基础数据发生了更改,函数知道如何使缓存的结果自失效。如果函数不使用任何基础数据,但正在进行系统日期下的数学运算,该怎么办?如何控制缓存的结果失效?

一个类似的函数提供的例子是,从一些大的愚蠢的循环遗留查询得到任何星期的星期日。我没有重写代码来消除对函数的需要,而是变得懒散了,在函数上抛出了一个快速处理所有问题。上周,它正确返回了上周的星期日,用于从双精度值选择find_sunday(1)。这个星期一,上星期天还在回来呢!结果仍然被缓存,当然应该被缓存;函数中没有表引用,会使缓存的结果无效。我假设RElieS_ON在这里可以帮到我,但是所有的例子都使用表名。我发现我可以让RELIES_ON(sysdate)编译...但我想这将立即失效,因为它从来没有相同的系统日期很长。另一方面,这可能永远不会失效,因为sysdate并不是真正的“数据”,它的定义永远不会改变。RElieS_ON(trunc(sysdate))不会编译,但基本上这就是我在类似这样的函数中寻找的...

最后,我刚刚摆脱了这个功能(和光标,当别人...你选择你的战斗) ,但我仍然留下了一个问题,如何使逻辑,可能是基于日期的函数,在那里无效可以被控制?

谢谢,约翰


创建或替换函数查找_SUNday (编号中的p_周_num )
返回日期结果_Cache

tmp_dt日期;
tmp_num编号;
开始
tmp_dt := TRUNC (SYS) ;
tmp_num := (p_xv_num - 1)*7 ;


中频p周数< 1
那么
tmp_dt := TO_日期('01/01/2000','MM/DD/YYYY') ;
其他
SELECT ( TRNC (SYSD,'d') + tmp_num)输入tmp_dt从双精度转换;
结束IF ;


返回(tmp_dt) ;
结束查找_SUN DAY ;

专家解答


这里有一些很好的信息

https://blogs.oracle.com/plsql-and-ebr/resource/How_To_Write_A_Safe_Result_Cached_Plsql_Function1.pdf

但是,定义“键”的其中一个因素是(显然)传递给它的参数,即,查看这个函数是否已经运行并可以使用结果缓存。

因此在您的示例中,如果您将*传递*日(即, trunc(sysdate ) )作为参数,那么当该值在*调用*上更改时,缓存将失效(或者更准确地说,在缓存中输入“第二天”的新值).

但是对于不执行SQL或调用外部的东西(如Web服务等) ,几乎不需要结果缓存。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论