我有一张桌子,上面存储着varchar2与“。”相同的数字。作为小数点分隔符(例如“ 5.92843”)。
varchar2
我想使用’,’来计算这些数字,因为这是系统默认值,并且已使用以下to_number方法进行了此操作:
to_number
TO_NUMBER(number,'99999D9999','NLS_NUMERIC_CHARACTERS = ''.,''')
我的问题是,某些数字可能非常长,因为该字段是如此VARCHAR2(100),并且当它长于我定义的格式时,我将to_number失败并显示ORA-01722。
VARCHAR2(100)
ORA-01722
有什么方法可以定义动态数字格式?只要设置十进制字符,我就不会真正在意格式。
有什么方法可以定义无限制的数字格式?
唯一的方法是在不指定格式掩码的情况下为nls_numeric_characters参数会话范围设置适当的值并使用to_number()功能。
nls_numeric_characters
to_number()
这是一个简单的示例,十进制分隔符是逗号",",数字文字包含句点"."作为十进制分隔符:
","
"."
SQL> show parameter nls_numeric_characters; NAME TYPE VALUE ------------------------------------ ----------- ------ nls_numeric_characters string ,. SQL> with t1(col) as( 2 select '12345.567' from dual union all 3 select '12.45' from dual 4 ) 5 select to_number(col) as res 6 from t1; select to_number(col) * ERROR at line 5: ORA-01722: invalid number SQL> alter session set nls_numeric_characters='.,'; Session altered. SQL> with t1(col) as( 2 select '12345.567' from dual union all 3 select '12.45' from dual 4 ) 5 select to_number(col) as res 6 from t1; res -------------- 12345.567 12.45