如何在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

  • 我不知道长度是怎么计算的,但它是错的
  • 字段1有错误:值大于此列允许的指定精度
  • 日期错误字段表示月份的日期必须介于1和月份的最后一天之间
    数字不能包含逗号。您要做的是使用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()