Dovrebbe funzionare quanto segue:
SELECT to_number(:x,
translate(:x, '012345678-+', '999999999SS'),
'nls_numeric_characters=''.,''')
FROM dual;
Creerà il secondo argomento corretto 999.999999
con l'efficiente translate
quindi non devi sapere quante cifre ci sono in anticipo. Funzionerà con tutti i formati numerici Oracle supportati (fino a 62 cifre significative apparentemente in 10.2.0.3).
È interessante notare che se hai una stringa davvero grande, il semplice to_number(:x)
funzionerà mentre questo metodo fallirà.
Modifica:supporto per numeri negativi grazie a sOliver.