如何在Oracle数据库中加载有理数

how to load rational numbers in Oracle database

我有一个包含以下格式数字的数据文件:

xx.xx (example : 0.3)

我必须用逗号而不是要加载到数据库中的点来转换它们。这是我的控制文件:

LOAD DATA
REPLACE
INTO TABLE USER.MYTABLE
FIELDS TERMINATED BY '$'
TRAILING NULLCOLS
(FIELD1,FIELD2,FIELD3,FIELD4,FIELD5,
NUMBER_FIELD "to_number(replace(:NUMBER_FIELD, '.', ','))",
FIELD6,FIELD7,FIELD8)

效果不错,但 0.3 变成了 ,3,没有零。那里有什么问题?

谢谢

我按照建议更改了我的控制文件:

LOAD DATA
REPLACE
INTO TABLE USER.MYTABLE
FIELDS TERMINATED BY '$'
TRAILING NULLCOLS
(FIELD1 DECIMAL(6,0),
FIELD2 VARCHAR,
FIELD3 VARCHAR,
FIELD4 VARCHAR,
FIELD5 VARCHAR,
FIELD6 FLOAT,
FIELD7 FLOAT,
FIELD8 DATE,
FIELD9 VARCHAR)

这样的数据行:

1$005$05$1$blablabla$0.50$0$01/02/1996$01

我有错误。

日志文件:

   Column Name                  Position   Len  Term Encl Datatype

FIELD1     FIRST     4           PACKED DECIMAL (6, 0)
FIELD2     NEXT     *           VARCHAR              
FIELD3     NEXT     *           VARCHAR              
FIELD4                                   NEXT     *           VARCHAR              
FIELD5     NEXT     *           VARCHAR              
FIELD6     NEXT     4           FLOAT                
FIELD7     NEXT     4           FLOAT                
FIELD8     NEXT     *   $       DATE DD/MM/YYYY      
FIELD9     NEXT     *           VARCHAR            
  1. 我不知道长度是怎么计算出来的,但它是错误的
  2. 我在 FIELD1 上出错:大于指定精度的值允许此列。
  3. 日期字段错误表明该月的第几天必须介于 1 和该月的最后一天之间。

数字不能包含逗号。您要做的是使用 to_number 函数创建字符串而不是数字。 to_char 可能会产生你想要的结果

将数字存储为数字要好得多(它们不以任何方式格式化,仅存储值),然后您可以非常轻松地对它们进行所有数字运算,并且仅在以下情况下格式化 OUTPUT您编写查询并从数据库中提取数据,可能是在对存储的数据进行数字操作之后。

无论如何,下面我将说明如何从数字中获取不同的字符格式。查看 to_char(number) 的 Oracle 文档以了解更多可能性。输出基于我的会话 NLS_NUMERIC_CHARACTERS,即 .对于小数和,对于千位分隔符。

select 0.3 as nmbr, to_char(0.3, '9.99') as str1, to_char(0.3, '0.00') as str2, 
       to_char(0.3, '0D0', 'nls_numeric_characters='',.''') as str3 from dual;

      NMBR STR1  STR2  STR3
---------- ----- ----- ----
        .3   .30  0.30  0,3

您在其中查询号码的会话将其格式化为 ,3,部分原因是您的 NLS 设置。根据您的个人资料,您位于法国,因此您的 NLS_NUMERIC_CHARACTER_SETTING 将为 ',.',因此小数点分隔符为逗号。在 SQL*Plus 和 SQL 开发人员工作表中,默认数字格式不显示前导零。如果要查看前导零,则需要指定格式:

select to_char(number_field, 'FM9990D999') from mytable

这将使用您会话的小数点分隔符;或强制使用:

select to_char(number_field, 'FM9990D999', 'NLS_NUMERIC_CHARACTERS='',.''') from mytable

FM 止损点在小数点后留下 trailing 个零;如果你想看那些,就把那个修饰符去掉。

您在加载时进行的转换不是必需的;您可以将控制文件更改为:

NUMBER_FIELD FLOAT,

它会被自动视为一个数字(它总是有一个句点小数点分隔符)。这比将 :NUMBER_FIELD 视为字符串,进行 'decimal' 替换,然后使用 NLS 设置转换为数字要干净。

您也可以通过其他方式指定 NLS 设置:

NUMBER_FIELD "to_number(:NUMBER_FIELD, '9999D999', 'NLS_NUMERIC_CHARACTERS=''.,''')",

当您指定数字格式时,对于 to_number()to_char(),您显然需要为您实际拥有的数据在小数点字符的每一侧留出足够的 0/9 占位符。如果您不知道或不想指定位数,则可以将 NLS_LANG 设置为在 运行 SQL 之前使用句点作为小数点分隔符的地区*加载程序,只需执行 "to_number(:NUMBER_FIELD)"。不过使用 FLOAT 更简单。