【问题标题】:RESULT_CACHE RELIES_ON (NLS_SESSION_PARAMETERS)RESULT_CACHE RELIES_ON (NLS_SESSION_PARAMETERS)
【发布时间】:2017-01-26 20:23:11
【问题描述】:

为什么每次我更改会话以设置新的 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;

【问题讨论】:

标签: caching plsql database-administration


【解决方案1】:

嗯...我想说答案就在问题中!如果你仔细阅读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
    ...
    

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

【讨论】:

    【解决方案2】:

    1) 在 Oracle 数据库 11gR2 中,RELIES ON 子句已被弃用,这意味着您甚至不必列出依赖项:Oracle 会为您解决所有问题。

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

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

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

    【讨论】:

    • 我已经解决了这个问题,如果我的应用程序调用这个函数来获取结果,我想知道结果不同的原因
    • 数据库重启会刷新这个缓存吗?
    猜你喜欢
    • 1970-01-01
    • 2021-06-22
    • 2020-05-01
    • 2011-10-17
    • 2012-06-23
    • 2019-02-17
    相关资源
    最近更新 更多