sqlldr同時處理兩種分隔符

redhouser發表於2011-10-12

使用sqlldr裝載資料時碰到如下問題:
所有欄位使用空格分隔,其中有兩個欄位使用雙引號包含(其中可能有空格),資料樣本、域分隔如下:
60.23.202.124 26.120.3.61 - - 1 [09/Oct/2011:09:00:01 +0800] "POST /BocnetClient/PAYSNo&SignDynPayments.do HTTP/1.1" 200 23089 ""
------------- ----------- - - - ---------------------------- ------------------------------------------------------- --- ----- --------------------------------

看起來很複雜,其實透過使用OPTIONALLY ENCLOSED BY就可以輕鬆實現。
另外,由於該欄位較長,需要在控制檔案中說明欄位長度(超過255),否則報錯。

--1,建立臨時表
drop table tmp_webaccess;
create table tmp_webaccess
(
  col1 varchar2(20),
  col2 varchar2(20),
  col3 varchar2(20),
  col4 varchar2(20),
  col5 varchar2(20),
  col6 date,
  col8 varchar2(200),
  col9 varchar2(100),
  col10 varchar2(100),
  col11 varchar2(200)
);
 

--2,建立控制檔案
more webaccess.ctl
LOAD DATA
infile "webaccess.txt"
Append INTO TABLE tmp_webaccess
FIELDS TERMINATED BY ' '
OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS
(
col1,
col2,
col3,
col4,
col5,
col6 "to_date(replace(:col6,'['),'dd/mm/yyyy:hh24:mi:ss')",
col7 filler,
col8 char(4000),
col9,
col10,
col11 char(4000)
)

--3,輸入資料檔案
more webaccess.txt
60.23.202.124 26.120.3.61 - - 1 [09/Oct/2011:09:00:01 +0800] "POST /BocnetClient/PAYSNo&SignDynPayments.do HTTP/1.1" 200 23089 ""


--4,裝載
sqlldr user/pwd control=webaccess.ctl

--另:sqlldr支援遠端載入資料,甚至支援easyconnect.
easyconnect條件:
(1),安裝Oracle客戶端
(2),客戶端$ORACLE_HOME/network/admin/sqlnet.ora中需要支援EZCONNECT:
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
否則報:
[oracle]$ sqlldr control=fund_inf.ctl

SQL*Loader: Release 10.2.0.1.0 - Production on Sun Apr 29 09:59:08 2012

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

SQL*Loader-704: Internal error: ulconnect: OCIServerAttach [0]
ORA-12154: TNS:could not resolve the connect identifier specified

(3),連線方式:
sqlplus

sqlldr control=fund_inf.ctl

 

 

 

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

相關文章