Ce qui suit devrait fonctionner :
SELECT to_number(:x,
translate(:x, '012345678-+', '999999999SS'),
'nls_numeric_characters=''.,''')
FROM dual;
Il construira le deuxième argument correct 999.999999
avec l'efficace translate
vous n'avez donc pas besoin de savoir combien de chiffres il y a à l'avance. Il fonctionnera avec tous les formats de nombre Oracle pris en charge (jusqu'à 62 chiffres significatifs apparemment dans 10.2.0.3).
Fait intéressant, si vous avez une très grande chaîne, le simple to_number(:x)
fonctionnera alors que cette méthode échouera.
Edit :support des nombres négatifs grâce à sOliver.