【问题标题】:Load data in Oracle via SQLLDR通过 SQLLDR 在 Oracle 中加载数据
【发布时间】:2019-02-10 10:37:54
【问题描述】:

我想通过 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 会自行查找除日期以外的所有类型?

非常感谢您的帮助。

【问题讨论】:

  • 我们可以假设这些是样本数据中值之间的制表符吗?它们在上面显示为空格序列,但您将分隔符指定为制表符。
  • 是的,它们是标签。

标签: oracle sql-loader


【解决方案1】:

通常最简单的方法是保留默认值并让转换发生在数据库中:

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 *加载器字段列表参考。

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

【讨论】:

  • 感谢您的提示。如果我这样做,我会收到以下错误消息:记录 1:被拒绝 - 表 PARKSCHEIN_ROTH 上的错误,列 DURATIONINMINUTES。 ORA-01722: 无效号码
  • 我将加载程序文件,列 durationinminutes 更改为 DECIMAL(38),现在几乎所有列都是正确的,除了 DURATIONINMINUTES:加载数据替换到表 parkschein_roth 字段中,以 '\t' 结尾,可选地由 ' 括起来"' ( bookingdate date 'YYYY-MM-DD' , customerid , locationid , numberofparkingticket , chargeticket , durationinminutes decimal(38)) 这是结果:27-Nov-18 13 Vienna 1 66.9 -310 为什么最后一列是负数?
  • 我在答案中添加了关于数字字段处理的注释。恐怕我无法重现您的 ORA-01722(Windows 10 上的 Oracle 12.2)。
  • Î 在 Excel 中创建了我的 txt 文件,将其导出为文本文件,然后将其导入 RedHat 上的 Oracle。所以,是的,Windows 中或多或少也有一些东西。那么,它在 Linux 中看起来像: 0000000 2 0 1 8 - 1 1 - 2 7 \t 1 3 \t V i 0000020 e n n a \t 1 \t 6 6 。 9 0 \t 3 0 \r 0000040 \n 0000041
  • 行终止符可能是 Windows 和 Linux 之间的问题。也许有一个杂散的回车弄乱了每条记录中的最后一个字段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-24
  • 1970-01-01
  • 1970-01-01
  • 2014-11-17
相关资源
最近更新 更多