2017-01-26 16 views
2

为什么下面的功能每一个我改变会话设置新的NLS_DATE_FORMATRESULT_CACHE RELIES_ON(NLS_SESSION_PARAMETERS)

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; 
+0

HI阿布舍克,你接受我的回答,说明您看到了怪异的行为?特别是,请参阅http://stackoverflow.com/help/accepted-answer –

回答

3

嗯......我想说的答案矗立在问问题的时候没有返回新参数值的方式!如果你仔细阅读Oracle documentation about Cross Session Functions,那么你就会知道。

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

这正是你创建你的函数时使用的是什么:

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 
    ... 
    

    (你可能需要做的其实与“虚拟”参数打抱不平被考虑)

2

1)利用Oracle数据库11gR2中,该RELIES ON条款已被弃用,这意味着,你甚至不必列出的依赖关系:甲骨文将事情做好你。

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

3)您也可以强制甲骨文刷新“RESULT_CACHE”

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

我已经纠正了这个问题,我想知道如果我的应用程序正在调用此函数来获得结果,结果会有所不同的原因 –

+0

将数据库重新启动刷新此缓存? –

相关问题