3

我有一个表格,其中的数字存储为varchar2“。” 作为小数分隔符(例如“5.92843”)。

我想使用“,”来计算这些数字,因为这是系统默认值,并使用以下to_number方法来执行此操作:

TO_NUMBER(number,'99999D9999','NLS_NUMERIC_CHARACTERS = ''.,''')

我的问题是某些数字可能很长,因为该字段是VARCHAR2(100),并且当它比我定义的格式长时,我会to_number失败并显示ORA-01722.

有什么方法可以定义动态数字格式吗?只要我可以设置十进制字符,我并不真正关心格式。

4

3 回答 3

2

有什么方法可以定义无限数字格式吗?

唯一的方法是为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    
于 2013-11-25T15:53:09.373 回答
0

你不能有“无限”的号码。最大精度为 38 位有效数字。从文档中。

于 2013-11-25T15:58:05.987 回答
0

您可以尝试以下方法之一(将它们作为一个想法,因为我没有在这里尝试它的数据库):

1) 使用不带格式的 TO_NUMBER。根据Oracle 文档,它使用点作为小数分隔符。

如果您的号码包含组分隔符,则首先删除这些并转换:

TO_NUMBER(TRANSLATE(number, ',''' ,''))

2)从您的输入生成数字格式:

select TO_NUMBER(n, TRANSLATE(n,' 1,234.567890',TO_CHAR(9999.9, '9G999D9')||'99999'))
from (select '9,876.54' as n from dual);

后者将所有数字转换为 9,将您的组字符(此处:逗号)和小数分隔符(此处:点)转换为 Oracle 默认使用的字符。

于 2013-11-25T16:33:24.243 回答