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