ORACLE-SQLLOAD導入外部數據詳解


今天公司需要把外部文本的一些數據導入到數據庫。這里把相關步驟和注意的地方記錄,供需要的人參考學習!這里的環境是在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行。

恢復正常:數據和數據文件完全一樣!到此整個數據導入完成!主要注意的地方還是數據文件的建立,確認分隔以及和表的結構對應!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM