RESULT_CACHE RELIES_ON(NLS_SESSION_PARAMETERS)

时间:2017-01-26 20:23:11

标签: caching plsql database-administration

为什么每次我更改会话以设置新的NLS_DATE_FORMAT时,下面的函数都没有返回新的参数值

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;

2 个答案:

答案 0 :(得分:3)

嗯......我会说答案就在于问题!如果您仔细阅读Oracle documentation about Cross Session Functions,那么您就知道了。

  

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

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

FUNCTION get_param(p_parameter IN VARCHAR2)
   RETURN VARCHAR2 
   RESULT_CACHE relies_on(nls_session_parameters) 
IS

确实 nls_session_parameters查看不会在您的通话中更改 !它是一个固定的系统视图。是什么改变了您的用户从中看到的内容。

所以你有解决方案:

  • 更简单,效率低(抱歉):从函数声明中删除RESULT_CACHE语句或找到一种方法来刷新调用之间的缓存
  • 添加一个将在您的通话之间更改的参数:

    FUNCTION get_param(p_parameter IN VARCHAR2, p_dummy_session_id IN NUMBER)
       RETURN VARCHAR2 RESULT_CACHE relies_on(nls_session_parameters) IS
    ...
    

    (您可能需要对“虚拟”参数进行实际操作才能将其考虑在内)

答案 1 :(得分:2)

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

2)此外,Oracle有V $ RESULT_CACHE_OBJECTS。有关于缓存对象的信息。

3)你也可以强迫oracle刷新' result_cache'

cellForRowAt