RESULT_CACHE RELIES_ON (NLS_SESSION_PARAMETERS)

2019-05-28 21:07发布

Why below function is not returning fresh param value every time I am altering session to set new 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;

2条回答
神经病院院长
2楼-- · 2019-05-28 21:28

Well... I would say the answer stands in the question! If you carefully read Oracle documentation about Cross Session Functions, then you'd know.

The cross-session PL/SQL function result cache provides a simple way to boost the performance of PL/SQL functions by saving the results of function calls for specific combinations of input parameters in the SGA. These results can be reused by any session calling the same function with the same parameters.

This is exactly what you're using when creating your function:

FUNCTION get_param(p_parameter IN VARCHAR2)
   RETURN VARCHAR2 
   RESULT_CACHE relies_on(nls_session_parameters) 
IS

Indeed nls_session_parameters View doesn't change between your calls! it is a fixed system view. What changes it what your user sees from it.

So you have solutions:

  • simpler and inefficient(sorry): remove RESULT_CACHE statement from your function declaration or find a way to refresh the cache between the calls
  • add a parameter that will change between your calls:

    FUNCTION get_param(p_parameter IN VARCHAR2, p_dummy_session_id IN NUMBER)
       RETURN VARCHAR2 RESULT_CACHE relies_on(nls_session_parameters) IS
    ...
    

    (you might need to actually do something with the "dummy" parameter for it to be taken into account)

查看更多
The star\"
3楼-- · 2019-05-28 21:38

1) With Oracle Database 11gR2, the RELIES ON clause is deprecated, which means that you don’t even have to list the dependencies: Oracle will figure everything out for you.

2) Moreover Oracle has V$RESULT_CACHE_OBJECTS. There are information about cached object.

3) You can also force the oracle to refresh 'result_cache'

declare 
 n number;
begin
 n := DBMS_RESULT_CACHE.INVALIDATE (user,'GET_PARAM');    
end;
查看更多
登录 后发表回答