Caching 结果缓存依赖于(NLS会话参数)
为什么每次我更改会话以设置新的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
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
- 添加将在两次调用之间更改的参数:
(您可能需要实际使用“dummy”参数来考虑它)FUNCTION get_param(p_parameter IN VARCHAR2, p_dummy_session_id IN NUMBER) RETURN VARCHAR2 RESULT_CACHE relies_on(nls_session_parameters) IS ...
依赖
子句,这意味着您甚至不必列出依赖项: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刷新这个缓存,结果会有差异的原因?嗨,阿披舍克,你接受我解释你看到的奇怪行为的回答吗?特别是指