通过 SQLLDR 在 Oracle 中加载数据

Load data in Oracle via SQLLDR

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

我文件中的数据也是这样的:

2018-11-27      13      Vienna  1       66.90   1

这是加载数据后的结果:

27-Nov-17 1443443505 ienna 909510961 0.9 3377

除日期栏以外的所有栏都是错误的

这是我的 table 结构:

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

这是我在文件中的 table 定义:

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 会自己找到除日期之外的所有类型?

非常感谢您的帮助。

将其保留为默认值并让转换在数据库中进行通常最简单:

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*加载程序字段列表参考中的 Numeric EXTERNAL

注意以下注释:似乎该行实际上以 00110001(字符 '1')结尾,后跟 00001101(Windows 回车 return)在换行之前。看看你得到的结果,它一定已经读取了这两个字节并将它们解释为 0000110100110001 以获得十进制 3377.