如何在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
- 我不知道长度是怎么计算出来的,但它是错误的
- 我在 FIELD1 上出错:大于指定精度的值允许此列。
- 日期字段错误表明该月的第几天必须介于 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
更简单。
我有一个包含以下格式数字的数据文件:
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
- 我不知道长度是怎么计算出来的,但它是错误的
- 我在 FIELD1 上出错:大于指定精度的值允许此列。
- 日期字段错误表明该月的第几天必须介于 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
更简单。