RESULT_CACHE RELIES_ON(NLS_SESSION_PARAMETERS)
为什么下面的功能每一个我改变会话设置新的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;
嗯......我想说的答案矗立在问问题的时候没有返回新参数值的方式!如果你仔细阅读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 ...
(你可能需要做的其实与“虚拟”参数打抱不平被考虑)
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;
我已经纠正了这个问题,我想知道如果我的应用程序正在调用此函数来获得结果,结果会有所不同的原因 –
将数据库重新启动刷新此缓存? –
HI阿布舍克,你接受我的回答,说明您看到了怪异的行为?特别是,请参阅http://stackoverflow.com/help/accepted-answer –