通过 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
.
我想通过 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
.