¿Cómo convertir eficientemente texto a número en Oracle PL / SQL con NLS_NUMERIC_CHARACTERS no predeterminados?

Estoy tratando de encontrar una manera eficiente y genérica de convertir una cadena a un número en PL / SQL, donde la configuración local para la configuración NLS_NUMERIC_CHARACTERS es impredecible, y es preferible que no la toque. El formato de entrada es el estándar de programación "123.456789", pero con un número desconocido de dígitos a cada lado del punto decimal.

select to_number('123.456789') from dual;
  -- only works if nls_numeric_characters is '.,'

select to_number('123.456789', '99999.9999999999') from dual;
  -- only works if the number of digits in the format is large enough
  -- but I don't want to guess...

to_number acepta un tercer parámetro, pero en ese caso también debe especificar un segundo parámetro, y no hay especificaciones de formato para "predeterminado" ...

select to_number('123.456789', null, 'nls_numeric_characters=''.,''') from dual;
  -- returns null

select to_number('123.456789', '99999D9999999999', 'nls_numeric_characters=''.,''') from dual;
  -- "works" with the same caveat as (2), so it's rather pointless...

Hay otra forma de usar PL / SQL:

CREATE OR REPLACE
FUNCTION STRING2NUMBER (p_string varchar2) RETURN NUMBER
IS
  v_decimal char;
BEGIN
  SELECT substr(VALUE, 1, 1)
  INTO v_decimal
  FROM NLS_SESSION_PARAMETERS
  WHERE PARAMETER = 'NLS_NUMERIC_CHARACTERS';
  return to_number(replace(p_string, '.', v_decimal));
END;
/

select string2number('123.456789') from dual;

que haceexactamente lo que quiero, pero no parece eficiente si lo haces muchas, muchas veces en una consulta. No puede almacenar en caché el valor de v_decimal (buscar una vez y almacenar en una variable de paquete) porque no sabe si cambia el valor de su sesión para NLS_NUMERIC_CHARACTERS, y luego se rompería nuevamente.

¿Estoy pasando por alto algo? ¿O me estoy preocupando demasiado, y Oracle hace esto mucho más eficiente de lo que yo le daría crédito?

Respuestas a la pregunta(3)

Su respuesta a la pregunta