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

时间:2016-10-04 12:04:18

标签: oracle sql-loader

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

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到最后一天之间。

3 个答案:

答案 0 :(得分:1)

将数字存储为数字(它们没有以任何方式格式化,只存储值)会更好,然后您可以非常轻松地对它们执行所有数字操作,并且只在编写时格式化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

答案 1 :(得分:1)

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

select to_char(number_field, 'FM9990D999') from mytable

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

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

FM个停靠点在小数点后面留下尾随零;如果你想看到那些,那就离开那个修饰语。

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

NUMBER_FIELD FLOAT,

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

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

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

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

答案 2 :(得分:0)

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