通过SQLLDR在Oracle中加载数据

时间:2019-02-10 10:37:55

标签: oracle sql-loader

我想通过sqlldr在Oracle中加载数据,但是,它总是以其他格式加载数据。

文件中的数据也是如此:

2018-11-27      13      Vienna  1       66.90   1

这是加载数据后的结果:

27-Nov-17 1443443505 ienna 909510961 0.9 3377

除日期列外的所有列都是错误的

这是我的表结构:

BOOKINGDATE DATE
CUSTOMERID NUMBER(38,0)
LOCATIONID VARCHAR(255 BYTE)
NUMBEROFPARKINGTICKET NUMBER(38,0)
CHARGETICKET NUMBER(18,2)
DURATIONINMINUTES NUMBER(38)

这是我文件中的表定义:

LOAD DATA
APPEND
INTO TABLE ROTH.PARKSCHEIN_ROTH
FIELDS TERMINATED BY '\t'
OPTIONALLY ENCLOSED BY '"'
(
BOOKINGDATE DATE 'YYYY-MM-DD',
CUSTOMERID INTEGER,
LOCATIONID CHAR(255),
NUMBEROFPARKINGTICKET INTEGER,
CHARGETICKET DECIMAL EXTERNAL,
DURATIONINMINUTES INTEGER
)

有人可以告诉我我必须使用哪些数据类型吗? 我以为Oracle会自动找到除日期以外的所有类型?

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

通常最简单的方法是将其保留为默认值,然后在数据库中进行转换:

load data
replace
into table parkschein_roth
fields terminated by '\t'
optionally enclosed by '"'
( bookingdate date 'YYYY-MM-DD'
, customerid
, locationid
, numberofparkingticket
, chargeticket
, durationinminutes )

然后,日志显示它已执行以下操作:

Column Name                      Position   Len  Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
BOOKINGDATE                         FIRST     *  WHT O(") DATE YYYY-MM-DD      
CUSTOMERID                           NEXT     *  WHT O(") CHARACTER            
LOCATIONID                           NEXT     *  WHT O(") CHARACTER            
NUMBEROFPARKINGTICKET                NEXT     *  WHT O(") CHARACTER            
CHARGETICKET                         NEXT     *  WHT O(") CHARACTER            
DURATIONINMINUTES                    NEXT     *  WHT O(") CHARACTER   

请注意,指定不带EXTERNAL关键字的数字数据类型将指示SQL * Loader直接读取文件中的二进制数据,而不是其字符表示形式:例如,在文本中显示为1的内容编辑器是字符49(即表示位序列00110001的符号),而不是实际的数字1。(我从未见过用二进制编码数字格式化的数据文件,但我想它们必须存在。) 《 SQL * Loader字段列表参考》中的Numeric EXTERNAL

请注意以下注释:似乎在换行之前,该行实际上以00110001(字符'1')结束,后跟00001101(Windows回车)。查看得到的结果,它必须已经读取了这两个字节并将其解释为0000110100110001才能获得十进制3377