如何在Oracle数据库中加载有理数
我有一个数据文件,其中包含以下格式的数字:如何在Oracle数据库中加载有理数,oracle,sql-loader,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, '
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变为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$blabla$0.50$0$01/02/1996$01
我有错误
日志文件:
Column Name Position Len Term Encl Datatype
数字不能包含逗号。您要做的是使用to_number函数创建字符串而不是数字。to_char可能会产生您想要的结果数字不能包含逗号。您要做的是使用to_number函数创建字符串而不是数字。要想得到你想要的结果,最好将数字存储为数字(它们不以任何方式格式化,只存储值),然后你可以很容易地对它们执行所有数字操作,并且只在编写查询和从数据库提取数据时格式化输出,可能在对存储的数据进行数字操作之后 无论如何,下面我将演示如何从数字中获取不同的字符格式。有关更多可能性,请参阅Oracle文档中的
to_char(number)
。输出基于会话的NLS_数字_字符,即。对于小数和,对于千分隔符
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
最好将数字存储为数字(它们不以任何方式格式化,只存储值),这样就可以非常轻松地对它们执行所有数字操作,并且只在编写查询并从数据库提取数据时格式化输出,可能是在对存储数据进行数字操作之后 无论如何,下面我将演示如何从数字中获取不同的字符格式。有关更多可能性,请参阅Oracle文档中的
to_char(number)
。输出基于会话的NLS_数字_字符,即。对于小数和,对于千分隔符
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_数值_字符_设置将是,.
,因此十进制分隔符是逗号。在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\u字段
视为字符串,进行“十进制”替换,然后使用NLS设置转换为数字更简洁
您也可以通过另一种方式指定NLS设置:
NUMBER_FIELD "to_number(:NUMBER_FIELD, '9999D999', 'NLS_NUMERIC_CHARACTERS=''.,''')",
当您指定数字格式时,对于
到_number()
或到_char()
,您显然需要为实际拥有的数据在十进制字符的每一侧留出足够的0/9占位符。如果您不知道或不想指定位数,则可以在运行SQL*Loader之前将NLS_LANG设置为使用句点作为十进制分隔符的区域,只需执行“to_number(:number_FIELD)”。不过,使用FLOAT
更简单。您在其中查询数字的会话将其格式化为,3
,部分原因是您的NLS设置。根据您的个人资料,您在法国,因此您的NLS_数值_字符_设置将是,.
,因此十进制分隔符是逗号。在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\u字段
视为字符串,进行“十进制”替换,然后使用NLS设置转换为数字更简洁
您也可以通过另一种方式指定NLS设置:
NUMBER_FIELD "to_number(:NUMBER_FIELD, '9999D999', 'NLS_NUMERIC_CHARACTERS=''.,''')",
当您指定数字格式时,对于
到_number()
或到_char()
,您显然需要为实际拥有的数据在十进制字符的每一侧留出足够的0/9占位符。如果您不知道或不想指定位数,则可以在运行SQL*Loader之前将NLS_LANG设置为使用句点作为十进制分隔符的区域,只需执行“to_number(:number_FIELD)”。不过,使用FLOAT
更简单。一个字符串(这是replace()
将提供给您的内容)被转换成一个数字,可以有逗号;在本例中,to_number()
使用NLS设置将该字符串转换为数字,NLS设置必须将逗号定义为十进制分隔符。您不能使用to_number
函数来创建字符串…正在转换为数字的字符串(即replace()
将提供的字符串)可以有逗号;在这种情况下,to_number()