Följande bör fungera:
SELECT to_number(:x,
translate(:x, '012345678-+', '999999999SS'),
'nls_numeric_characters=''.,''')
FROM dual;
Det kommer att bygga det korrekta andra argumentet 999.999999
med den effektiva translate
så du behöver inte veta hur många siffror det finns i förväg. Det kommer att fungera med alla Oracle-nummerformat som stöds (upp till 62 signifikanta siffror tydligen i 10.2.0.3).
Intressant nog, om du har en riktigt stor sträng den enkla to_number(:x)
kommer att fungera medan den här metoden kommer att misslyckas.
Edit:stöd för negativa siffror tack vare sOliver.