Caching 结果缓存依赖于(NLS会话参数)

Caching 结果缓存依赖于(NLS会话参数),caching,plsql,database-administration,Caching,Plsql,Database Administration,为什么每次我更改会话以设置新的NLS_日期_格式时,下面的函数都不返回新的参数值 FUNCTION get_param(p_parameter IN VARCHAR2) RETURN VARCHAR2 RESULT_CACHE relies_on(nls_session_parameters) IS l_value nls_session_parameters.value%TYPE; BEGIN dbg('Entered Fn_Get_nls_session_Paramete

为什么每次我更改会话以设置新的NLS_日期_格式时,下面的函数都不返回新的参数值

FUNCTION get_param(p_parameter IN VARCHAR2)
   RETURN VARCHAR2 RESULT_CACHE relies_on(nls_session_parameters) IS
   l_value nls_session_parameters.value%TYPE;
BEGIN
   dbg('Entered  Fn_Get_nls_session_Parameter_frc to cache details for .. ' || p_parameter);
   SELECT SYS_CONTEXT('USERENV', p_parameter) INTO l_value FROM dual;
   RETURN l_value;
EXCEPTION
   WHEN NO_DATA_FOUND THEN
      dbg('In NDF : Gng to return value as null.. ');
      l_value := NULL;
      RETURN l_value;
END get_param;

嗯。。。我会说答案就在问题中!如果你仔细阅读,你就会知道

跨会话PL/SQL函数结果缓存通过在SGA中保存特定输入参数组合的函数调用结果,提供了一种提高PL/SQL函数性能的简单方法。这些结果可由调用相同函数的任何会话使用相同的参数重新使用

这正是您在创建函数时使用的内容:

FUNCTION get_param(p_parameter IN VARCHAR2)
   RETURN VARCHAR2 
   RESULT_CACHE relies_on(nls_session_parameters) 
IS
实际上,
nls\u会话\u参数
视图在两次调用之间不会更改!这是一个固定的系统视图。什么改变了它,用户从中看到了什么

所以你有解决方案:

  • 更简单且效率低下(抱歉):从函数声明中删除
    RESULT\u CACHE
    语句,或者找到一种方法在调用之间刷新缓存
  • 添加将在两次调用之间更改的参数:

    FUNCTION get_param(p_parameter IN VARCHAR2, p_dummy_session_id IN NUMBER)
       RETURN VARCHAR2 RESULT_CACHE relies_on(nls_session_parameters) IS
    ...
    
    (您可能需要实际使用“dummy”参数来考虑它)

1)对于Oracle Database 11gR2,不推荐使用
依赖
子句,这意味着您甚至不必列出依赖项:Oracle将为您解决所有问题

2) 此外,Oracle有V$RESULT\u CACHE\u对象。有关于缓存对象的信息

3) 您还可以强制oracle刷新“结果\u缓存”

declare 
 n number;
begin
 n := DBMS_RESULT_CACHE.INVALIDATE (user,'GET_PARAM');    
end;

我已经纠正了这个问题,我想知道如果我的应用程序调用这个函数来获得resultWill DB restart刷新这个缓存,结果会有差异的原因?嗨,阿披舍克,你接受我解释你看到的奇怪行为的回答吗?特别是指