如何从Oracle SQL中的科学记数法转换?

Scr*_*Dev 4 sql oracle sql-loader

我们正在尝试将FastExport创建的文件加载到oracle数据库中.
但是,Float列的导出方式如下:1.47654345670000000000 E010.

如何配置SQL*Loader来导入它.

期望控制脚本看起来像:

OPTIONS(DIRECT=TRUE, ROWS=20000, BINDSIZE=8388608, READSIZE=8388608)
UNRECOVERABLE LOAD DATA 
infile 'data/SOME_FILE.csv'
append
INTO TABLE SOME_TABLE
fields terminated by ','
OPTIONALLY ENCLOSED BY '"' AND '"'
trailing nullcols (
    FLOAT_VALUE             CHAR(38)       "???????????????????",
    FILED02                 CHAR(5)        "TRIM(:FILED02)",
    FILED03                 TIMESTAMP      "YYYY-MM-DD HH24:MI:SS.FF6",
    FILED04                 CHAR(38)
)
Run Code Online (Sandbox Code Playgroud)


我试过了 to_number('1.47654345670000000000 E010', '9.99999999999999999999 EEEE')

错误:ORA-01481: invalid number format model错误.


我试过了 to_number('1.47654345670000000000 E010', '9.99999999999999999999EEEE')

错误: ORA-01722: invalid number


这些是我按照优先顺序提出的解决方案:

  1. to_number(replace('1.47654345670000000000 E010', ' ', ''))
  2. to_number(TRANSLATE('1.47654345670000000000 E010', '1 ', '1'))

我想知道是否有更好的解决方案.

Ale*_*ole 8

据我所知,没有办法to_number忽略空间,你无法在SQL*Loader中做任何事情来做好准备.如果您无法通过预处理文件来删除它,而您建议的文件不是一个选项,那么您必须在某个时候使用字符串函数.我不希望它添加处理数额巨大的,上面什么TO_NUMBER无论如何都会做,但我总是尝试一下,看看,而不是假设任何事情-避免字符串函数听起来有点像过早的优化.无论如何,最简单的可能是replace:

select to_number(replace('1.47654345670000000000 E010',' ',''),
    '9.99999999999999999999EEEE') from dual;
Run Code Online (Sandbox Code Playgroud)

或仅用于显示目的:

column num format 99999999999
select to_number(replace('1.47654345670000000000 E010',' ',''),
    '9.99999999999999999999EEEE') as num from dual


         NUM
------------
 14765434567
Run Code Online (Sandbox Code Playgroud)

你可以定义自己的函数来略微简化控制文件,但不确定它是否值得.

我想到了另外两个选择.(a)作为a加载到临时表中varchar,然后使用to_number(replace()); 填充真实表; 但我怀疑这会有什么改善,可能会更糟糕.或者(b)如果您正在运行11g,请加载到varchar实际表中的列中,并使您的数字列成为应用这些函数的虚拟列.

实际上,第三个选项......根本不使用SQL Loader,而是使用CSV文件作为外部表,并从中填充真实表.你仍然需要这样做,to_number(replace())但你可能会发现在SQL Loader中执行它的性能有所不同.当然,差别可能是它更糟糕,但可能值得尝试.


Add*_*bbA 6

使用“set numw”更改数字宽度


从 blabla 中选择 num >

结果 >> 1,0293E+15


设置数字 20;

从 blabla 中选择 num >

结果 >> 1029301200000021