Lo siguiente debería funcionar:
SELECT to_number(:x,
translate(:x, '012345678-+', '999999999SS'),
'nls_numeric_characters=''.,''')
FROM dual;
Construirá el segundo argumento correcto 999.999999
con el eficiente translate
así que no tienes que saber cuántos dígitos hay de antemano. Funcionará con todos los formatos de números de Oracle admitidos (hasta 62 dígitos significativos aparentemente en 10.2.0.3).
Curiosamente, si tiene una cadena realmente grande, el simple to_number(:x)
funcionará mientras que este método fallará.
Editar:soporte para números negativos gracias a sOliver.