Linux環境SQLLDR匯入出現SQLLOADER-553、509錯誤

yangtingkun發表於2011-08-10

Linux環境下SQLLOADER匯入LOB資料,碰到了這個錯誤。

 

 

奇怪的是,整個測試在Windows環境下測試沒有問題,包括控制檔案和資料檔案,都是直接複製到Linux環境中,唯一的修改是針對WindowsLinux路徑的區別,對資料檔案中的路徑進行了修改。

控制檔案如下:

[oracle@dbserver1 sqlldr]$ more sqlldr_1M.ctl
LOAD DATA
INFILE 'filename.dat'
INTO TABLE T_LOAD_1M
TRUNCATE
FIELDS TERMINATED BY ','
(ID CHAR(255),
FULL_NAME CHAR(255),
CREATE_DATE SYSDATE,
CONTENTS LOBFILE(FULL_NAME) TERMINATED BY EOF)

而資料檔案filename.dat的格式如下:

[oracle@dbserver1 sqlldr]$ more filename.dat
1,/home/oracle/2M/IMG_5015.JPG
2,/home/oracle/2M/IMG_5016.JPG
3,/home/oracle/2M/IMG_5017.JPG
4,/home/oracle/2M/IMG_5018.JPG
5,/home/oracle/2M/IMG_5022.JPG
6,/home/oracle/2M/IMG_5023.JPG
7,/home/oracle/2M/IMG_5025.JPG
8,/home/oracle/2M/IMG_5026.JPG
9,/home/oracle/2M/IMG_5027.JPG
10,/home/oracle/2M/IMG_5028.JPG
11,/home/oracle/2M/IMG_5029.JPG
12,/home/oracle/2M/IMG_5030.JPG
13,/home/oracle/2M/IMG_5031.JPG
.
.
.
661,/home/oracle/2M/DSC00140.JPG
662,/home/oracle/2M/DSC00141.JPG
663,/home/oracle/2M/DSC00142.JPG
664,/home/oracle/2M/DSC00143.JPG

匯入命令很簡單,除了制定使用者名稱、密碼外,唯一的引數就是控制檔名。結果匯出碰到下面的錯誤。

[oracle@dbserver1 sqlldr]$ sqlldr enmotest/password control=sqlldr_1M.ctl

SQL*Loader: Release 11.2.0.2.0 - Production on Fri Aug 5 15:19:20 2011

Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.

' for field CONTENTS table T_LOAD_1Mfile 'IMG_9651.txt
SQL*Loader-553: file not found
SQL*Loader-509: System error: No such file or directory
Commit point reached - logical record count 1

錯誤指出檔案不存在,而第一行的資訊比較奇怪,要說沒有意義,裡面還是包含了有價值的資訊的,要說有意義,整個語句沒有開頭也沒有結尾,而且通順不起來。

由於在Windows環境下測試過,懷疑是Linux環境的bug,檢查metalink,找到一個Bug 11777231的描述,雖然和我的問題並不一樣,但是這個錯誤的錯誤資訊幫我找到了方向:

SQL*Loader-502: unable to open data file 'ADFFNTEIICDEV3ADAOAT1.DAT' for
field NOTE_DETAILS_BODY table DLO_STAGE.ADFFNTE
SQL*Loader-553: file not found
SQL*Loader-509: System error: The system cannot find the file specified.

對比這個錯誤資訊和前面的得到的錯誤資訊,可以確定第一行模糊不清的錯誤肯定是SQL*LOADER-502錯誤,而導致錯誤資訊不全的原因是由於Linux上的回車沒有換行,導致新一行的資料從本行開頭覆蓋了第一行的資訊。

根據行中出現換行的位置,以及找不到檔案的錯誤資訊,很容易判斷,問題出在資料檔案中。而導致檔案的原因也就明確了,雖然filename.dat是一個文字檔案,但是由於這個dat字尾,在ftp的時候被工具當做了二進位制檔案,因此沒有做轉化,而Windows上只有一個回車是正常的,但是Linux上只有回車沒有換行就會導致這樣的問題。

最簡單的辦法就是修改資料檔案的字尾,然後利用ftpASCII碼方式或sftp直接複製。隨後sqlldr匯入就沒有任何問題了。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-704654/,如需轉載,請註明出處,否則將追究法律責任。

相關文章