SQL Loader问题加载十进制负数

时间:2018-08-20 21:27:25

标签: oracle sqlplus sql-loader

在使用SQL Loader加载小型表时,我遇到以下问题,我的过程填充了一个字段,该字段可以填充正数或负十进制数,问题是当数为正数时,该过程以2个位置取整,但如果为负数,则仅使用1个位置。我需要2个位置,这是简单的代码:

UNRECOVERABLE LOAD DATA
TRUNCATE
INTO TABLE [SCHEMA].TABLE1
FIELDS TERMINATED BY '|'
OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
FIELD1 "trim(:FIELD1 )" 
)

示例:

Source:  12345,78 Target:  1234,78

Source: -12345,78 Target: -1234,8

Edit1:它只是发生在具有7个或更多整数长度(X <-1000000)的数字上,但是我可以使用常规插入而不是SQLLoader插入这个数字。

Edit2:我注意到sql * loader没问题,因为.ctl已经错误。此文件是使用具有以下属性的python和SQL生成的:

set colsep |
set headsep off
set pagesize 0
set trimspool on
set linesize 10000
set termout off
set feedback off
set arraysize 250

但是我不知道在哪里定义每个字段的长度,这看起来是错误的。

1 个答案:

答案 0 :(得分:0)

我要说你看起来不正确。数据可能存储正确,但是您看不到它。这是一个示例:

SQL> create table test (field1 number);

Table created.

SQL>

控制文件:

load data
infile *
replace into table test
fields terminated by '|' trailing nullcols
(
field1
)
begindata
12345,78
-12345,78
987654321
-987654321
987654321,01234
-987654321,01234
111333444,887766
-112333444,887766

加载会话和结果:

SQL> $sqlldr scott/tiger@orcl control=test26.ctl log=test26.log

SQL*Loader: Release 11.2.0.2.0 - Production on Uto Kol 21 08:52:10 2018

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

Commit point reached - logical record count 7
Commit point reached - logical record count 8

SQL> select * from test;

    FIELD1
----------
  12345,78
 -12345,78
 987654321
-987654321
 987654321
-987654321
 111333445
-112333445

8 rows selected.

SQL>

糟糕!似乎是错误的,是吗?但是,如果您修复列格式...

SQL> col field1 format 999g999g999g990d000000
SQL> select * from test;

                 FIELD1
-----------------------
          12.345,780000
         -12.345,780000
     987.654.321,000000
    -987.654.321,000000
     987.654.321,012340
    -987.654.321,012340
     111.333.444,887766
    -112.333.444,887766

8 rows selected.

SQL>

看到了吗?一切都在这里。

我猜想,如果您使用GUI,就不会有这样的问题。相反,前一句话并不意味着您不应该使用SQL * Plus。只是...学习如何正确使用它:)

[阅读评论后,编辑]

您可能正在寻找SET NUMFORMAT

SQL> select -12334.789123 from dual;

-12334.789123
-------------
   -12334,789

SQL> set numformat 999g999g990d000000
SQL> select -12334.789123 from dual;

      -12334.789123
-------------------
     -12.334,789123

SQL>