O seguinte deve funcionar:
SELECT to_number(:x,
translate(:x, '012345678-+', '999999999SS'),
'nls_numeric_characters=''.,''')
FROM dual;
Ele construirá o segundo argumento correto
999.999999
com o eficiente translate
então você não precisa saber quantos dígitos existem de antemão. Ele funcionará com todos os formatos de número Oracle suportados (até 62 dígitos significativos aparentemente em 10.2.0.3). Curiosamente, se você tiver uma string muito grande, o simples
to_number(:x)
funcionará enquanto este método falhará. Edit:suporte para números negativos graças ao sOliver.