今天公司需要把外部文本的一些數據導入到數據庫。這里把相關步驟和注意的地方記錄,供需要的人參考學習!這里的環境是在windows下的數據庫,linux或者其他數據庫同理!
1、准備工作:創建需要導入數據的表結構,如果已有相關的表,此步省略!
SQL> create table test
2 (
3 host VARCHAR2(30),
4 user_name VARCHAR2(30),
5 ip_address VARCHAR2(15),
6 pass VARCHAR2(4) default 'no' not null,
7 judge NUMBER default 0 not null,
8 endtime DATE
9 );
表已創建。
2、編寫sqlload導入數據的控制文件,這里測試的控制文件如下,可以根據自己需要添加相關的控制參數,測試的話復制保存為txt文件即可!
LOAD DATA INFILE 'd:\data.txt' INTO TABLE test TRUNCATE fields terminated by ',' trailing nullcols (HOST,USER_NAME,IP_AddrESS,PASS,JUDge,endTIME)
控制文件還有其他參數,根據自己需求調整和測試:
附部分控制參數:具體用法以官方文檔為准
OPTIONS (skip=1,rows=128) -- sqlldr 命令顯示的選項可以寫到這里邊來,skip=1 用來跳過數據中的第一行 LOAD DATA INFILE "users_data.csv" --指定外部數據文件,可以是不同格式的數據文件,如csv、txt都支持可以寫
多個 INFILE "another_data_file.csv" 指定多個數據文件 truncate --操作類型,用 truncate table 來清除表中原有記錄,根據情況而定是否需要清楚原有表中數據 INTO TABLE users --要插入記錄的表 Fields terminated by "," --數據中每行記錄用 "," 分隔 Optionally enclosed by '"' --數據中每個字段用 '"' 雙引號框起,比如字段中有 "," 分隔符時 trailing nullcols --表的字段沒有對應的值時允許為空 ( virtual_column FILLER, --這是一個虛擬字段,用來跳過由 PL/SQL Developer 生成的第一列序號 user_id number, --字段可以指定類型,否則認為是 CHARACTER 類型, log 文件中有顯示 user_name, login_times, last_login DATE "YYYY-MM-DD HH24:MI:SS" -- 指定接受日期的格式,相當用 to_date() 函數轉換 ) --------------------------------------------------------------------------------------------- insert --為缺省方式,在數據裝載開始時要求表為空 append --在表中追加新記錄 replace --刪除舊記錄(用 delete from table 語句),替換成新裝載的記錄 truncate --刪除舊記錄(用 truncate table 語句),替換成新裝載的記錄
3、創建需要導入的數據,注意數據格式必須和表結構嚴格對應,否則導入失敗!測試數據如下:有部分數據最后字段為空,所以控制文件中需要加trailing nullcols 參數!

ttt,SCOTT,192.168.1.111,yes,1, qq,JACK,192.168.1.20,no,1, YY,TOM,192.168.1.20,no,1, WEB1,HAHA,192.168.1.1,no,1, XXX,ROBIN,111.111.111.111,no,1,08-AUG-08 DB2,LUCY,192.168.10.10,no,1, ORACLE,LILY,222.222.222.222,no,1, WORKGROUP,DENNIS,133.133.133.133,no,0,08-AUG-08 DCR,CANDY,192.168.100.10,no,1, T3,FLY,192.168.10.33,no,1, T1,LINDA,192.168.10.200,no,1,08-AUG-08 T2,LILEI,192.168.100.31,no,1,08-AUG-08
4、導入數據-導入時也有相關的參數進行控制
附部分導入參數:各參數可以再命令行下輸入sqlldr查看
C:\Documents and Settings\Administrator>sqlldr
SQL*Loader: Release 11.2.0.1.0 - Production on 星期三 2月 27 17:13:24 2013
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
用法: SQLLDR keyword=value [,keyword=value,...]
有效的關鍵字:
userid -- ORACLE 用戶名/口令
control -- 控制文件名
log -- 日志文件名
bad -- 錯誤文件名
data -- 數據文件名
discard -- 廢棄文件名
discardmax -- 允許廢棄的文件的數目 (全部默認)
skip -- 要跳過的邏輯記錄的數目 (默認 0)
load -- 要加載的邏輯記錄的數目 (全部默認)
errors -- 允許的錯誤的數目 (默認 50)
rows -- 常規路徑綁定數組中或直接路徑保存數據間的行數
(默認: 常規路徑 64, 所有直接路徑)
bindsize -- 常規路徑綁定數組的大小 (以字節計) (默認 256000)
silent -- 運行過程中隱藏消息 (標題,反饋,錯誤,廢棄,分區)
direct -- 使用直接路徑 (默認 FALSE)
parfile -- 參數文件: 包含參數說明的文件的名稱
parallel -- 執行並行加載 (默認 FALSE)
file -- 要從以下對象中分配區的文件
skip_unusable_indexes -- 不允許/允許使用無用的索引或索引分區 (默認 FALSE)
skip_index_maintenance -- 沒有維護索引, 將受到影響的索引標記為無用 (默認 FALSE)
commit_discontinued -- 提交加載中斷時已加載的行 (默認 FALSE)
readsize -- 讀取緩沖區的大小 (默認 1048576)
external_table -- 使用外部表進行加載; NOT_USED, GENERATE_ONLY, EXECUTE (默認 NO
T_USED)
columnarrayrows -- 直接路徑列數組的行數 (默認 5000)
streamsize -- 直接路徑流緩沖區的大小 (以字節計) (默認 256000)
multithreading -- 在直接路徑中使用多線程
resumable -- 啟用或禁用當前的可恢復會話 (默認 FALSE)
resumable_name -- 有助於標識可恢復語句的文本字符串
resumable_timeout -- RESUMABLE 的等待時間 (以秒計) (默認 7200)
date_cache -- 日期轉換高速緩存的大小 (以條目計) (默認 1000)
no_index_errors -- 出現任何索引錯誤時中止加載 (默認 FALSE)
如下命令:control=指定控制文件和路徑 log=導入日志文件保存 bad=錯誤信息 data=數據文件
開始導入:
C:\Documents and Settings\Administrator>sqlldr scott/tiger control=d:\sqlload.txt log=d:\loadlog.txt bad=d:\bad.txt data=d:\data.txt
SQL*Loader: Release 11.2.0.1.0 - Production on 星期三 2月 27 17:06:52 2013
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
達到提交點 - 邏輯記錄計數 12
導入成功后查看結果:
C:\Documents and Settings\Administrator>sqlplus scott/tiger
SQL*Plus: Release 11.2.0.1.0 Production on 星期三 2月 27 17:07:05 2013
Copyright (c) 1982, 2010, Oracle. All rights reserved.
連接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> select * from test;
HOST USER_NAME IP_ADDRESS PASS JUDGE ENDTIME
---------- ---------- ------------------------------ -------- ---------- --------------
ttt SCOTT 192.168.1.111 yes 1
qq JACK 192.168.1.20 no 1
YY TOM 192.168.1.20 no 1
WEB1 HAHA 192.168.1.1 no 1
DB2 LUCY 192.168.10.10 no 1
ORACLE LILY 222.222.222.222 no 1
DCR CANDY 192.168.100.10 no 1
T3 FLY 192.168.10.33 no 1
已選擇8行。
結果顯然與數據文件不一致,最后一個字段有值的數據沒有導入!這不是最后想要的結果!但可以確定已經有數據導入,表示表對象和控制文件沒問題!
應該是數據文件的格式問題!注意數據文件最后一個字段是日期型數據。查看是不是數據庫現有日期類型不支持數據文件的表示格式
SQL> select sysdate from dual; SYSDATE -------------- 27-2月 -13
顯然和我們數據文件的日期顯示不一致,且是中文,這里可以把數據文件的最后字段的數據改成和數據庫一樣的格式,也可以對數據庫的格式和語言進行更改,
因為測試系統是windows才會出現這個錯誤,在linux可以避免!
如果是linux 可以嘗試以下步驟解決:
alter system set nls_date_format='DD-MON-RR';
alter system set nls_language= american scope = spfile;------------得重啟數據庫
這里由於是windows,這里就不更改語言和重啟數據庫,直接對數據文件進行更改,修改后的數據文件如下
ttt,SCOTT,192.168.1.111,yes,1, qq,JACK,192.168.1.20,no,1, YY,TOM,192.168.1.20,no,1, WEB1,HAHA,192.168.1.1,no,1, XXX,ROBIN,111.111.111.111,no,1,08-5月 -08 DB2,LUCY,192.168.10.10,no,1, ORACLE,LILY,222.222.222.222,no,1, WORKGROUP,DENNIS,133.133.133.133,no,0,08-5月 -08 DCR,CANDY,192.168.100.10,no,1, T3,FLY,192.168.10.33,no,1, T1,LINDA,192.168.10.200,no,1,08-5月 -08 T2,LILEI,192.168.100.31,no,1,08-5月 -08
再導入一次,導入后進行查看結果
C:\Documents and Settings\Administrator>sqlldr scott/tiger control=d:\sqlload.txt log=d:\loadlog.txt bad=d:\bad.txt data=d:\data.txt
SQL*Loader: Release 11.2.0.1.0 - Production on 星期三 2月 27 17:48:44 2013
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
達到提交點 - 邏輯記錄計數 12
C:\Documents and Settings\Administrator>sqlplus scott/tiger
SQL*Plus: Release 11.2.0.1.0 Production on 星期三 2月 27 17:49:21 2013
Copyright (c) 1982, 2010, Oracle. All rights reserved.
連接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> col host for a10
SQL> col user_name for a15
SQL> select * from test;
HOST USER_NAME IP_ADDRESS PASS JUDGE ENDTIME
---------- --------------- ------------------------------ -------- ---------- --------------
ttt SCOTT 192.168.1.111 yes 1
qq JACK 192.168.1.20 no 1
YY TOM 192.168.1.20 no 1
WEB1 HAHA 192.168.1.1 no 1
XXX ROBIN 111.111.111.111 no 1 08-5月 -08
DB2 LUCY 192.168.10.10 no 1
ORACLE LILY 222.222.222.222 no 1
WORKGROUP DENNIS 133.133.133.133 no 0 08-5月 -08
DCR CANDY 192.168.100.10 no 1
T3 FLY 192.168.10.33 no 1
T1 LINDA 192.168.10.200 no 1 08-5月 -08
T2 LILEI 192.168.100.31 no 1 08-5月 -08
已選擇12行。
恢復正常:數據和數據文件完全一樣!到此整個數據導入完成!主要注意的地方還是數據文件的建立,確認分隔以及和表的結構對應!