2016-10-04 51 views
0

加载有理数我有一个数字的数据文件,格式如下:如何在Oracle数据库

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 

​​
  1. 我不知道lenght是如何计算的,但它是错误的
  2. 我有错误的FIELD1:值大于指定的精度更大的允许本专栏。
  3. 日期字段上的错误表示该月的某一天必须在该月的1日和最后一天之间。
+0

如果您有新问题,请提出一个新问题。包含要加载的表的DDL,以及一些实际的错误数据(来自.bad文件)。但是我只能指定它所关注的字段类型 - 删除“VARCHAR”规范和“DECIMAL” - 应该隐式转换。对于日期一,是文件DD/MM/YYYY中的值,或实际上是MM/DD/YYYY - 错误表明后者。 [您可以指定格式掩码](https://docs.oracle.com/cd/E11882_01/server.112/e22490/ldr_field_list.htm#sthref792)。 –

+0

不,这是文件中的DD/MM/YYYY,但最后我没有指定日期并且它被隐式转换。所以它被解决 – mlwacosmos

回答

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更简单。

+0

所以你只是告诉我加载是好的 – mlwacosmos

+0

@mlwacosmos - 我告诉你加载是好的(但已经给出了替代方案);而且这些数字没有固有的格式。以及如何在小数点分隔符前用零显示您的数字。这也是mathguy所展示的。 –

0

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

+0

一个字符串 - 这是什么'replace()'会给你 - 正在转换为一个数字可以有逗号;在这种情况下,'to_number()'将使用NLS设置将该字符串转换为数字,必须将逗号定义为小数分隔符。你不能用'to_number'函数来创建一个字符串... –

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 
+0

它看起来像它*是*存储为一个数字;负载显式调用'to_number()',以避免来自NLS设置的隐式转换问题。我认为。 –

+1

@AlexPoole - 我并不是想暗示当前的代码不会将该值加载/存储为数字。相反,由于OP在加载之前谈到了“用逗号转换它们”,这可能意味着他可能会考虑将其改为存储char值的东西。我只是分享我的意见,这不会是最佳的。干杯! – mathguy

+0

我同意你和数字确实存储为数字。尽管在Oracle配置中,逗号用于识别数字,这是从数据文件加载到数据库时的原因,因为oracle数字的格式不是很好。 – mlwacosmos