我想通过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会自动找到除日期以外的所有类型?
非常感谢您的帮助。
答案 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
。