sqlldr的學習與總結

靜以致遠√團團發表於2013-11-19
######################################      sqlldr資料載入工具的學習總結   




sqlldr是oracle7以來一直比較流行的資料載入工具,使用方便,靈活,在windows介面下是SQLLDR,linux/unix 平臺大小寫敏感,是sqlldr


有關sqlldr的五個檔案:
1.控制檔案:顧名思義該檔案負責控制載入資料的關鍵資訊,其中重要引數如下:
  LOAD DATA 控制檔案一般都是以此開頭,用來表示載入資料,預設的不用加任何引數,引數主要有UNRECOVER和RECOVER用來控制所載入資料是否可以恢復,也可以為CONTINUE_LOAD表示繼續載入
  INFILE 表示要載入的資料檔案的位置,若為*表示該資料檔案寫在該控制檔案內部
  INTO TABLE 表示要載入資料的目標表,載入方式有以下幾種:
INSERT INTO 向表中插入資料,該方式表必須為空表
APPEND INTO 向表中追加資料
REPLACE INTO 替換表中的資料,等於將表的資料delete後再向表中新增資料
TRUNCATE INTO 以truncate的方式將表中的資料清空後載入資料
  FIELDS TERMINATED BY "," 指定載入資料的分隔值,此處認為是,分割
  (NAME,SEX,AGE)要加入的表中的列名
  BEGINDATA 表示以下是要載入的資料,INFILE為*時引數才用得到
2.資料檔案
  資料檔案為要載入的資料儲存檔案,格式不統一
3.日誌檔案
  預設情況下載入資料完成後會在控制檔案同目錄下生成一個副檔名為.log的日誌檔案,用來記錄資料載入情況
4.錯誤檔案
  在sqlldr載入資料時遇到載入錯誤的資料,會把載入錯誤的資料寫入同名下副檔名為.bad的錯誤檔案中。該引數可以自行修改
5.廢棄檔案
  如果有需求,可以顯示的制定廢棄資料(不需要載入的資料)寫入到一個副檔名為.dsc的廢棄檔案中,該檔案需要特殊制定,預設情況下不會產生




一個簡單的sqlldr的控制檔案:
[oracle@orcl2 myscript]$ pwd
/u01/myscript


在/u01/myscript下做sqlldr的練習,寫入sqlldr1.ctl如下內容


LOAD DATA  


INFILE *   //為*說明我要載入的資料就在該控制檔案內
INTO TABLE BONUS //將資料載入到bouns表中
FIELDS TERMINATED BY "," //分割符用的是,
(ENAME,JOB,SAL) //制定要載入到表中的列名


BEGINDATA //以下部分為要載入的資料
TOM,EMP,100
LALY,EMP,110
TOKE,EMP,120
JONE,EMP,130
JECL,MGR,140
JECK,HR,150
KULI,MGR,160


以scott使用者建立bonus表結構
SQL> conn scott/oracle
Connected.
SQL> create table bonus(ENAME varchar(20),JOB varchar(15),SAL number);


Table created.


開始載入資料:
[oracle@orcl2 myscript]$ sqlldr scott/oracle control=sqlldr1.ctl


SQL*Loader: Release 10.2.0.1.0 - Production on Tue Nov 19 10:21:58 2013


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


Commit point reached - logical record count 8


資料載入完畢,檢視通目錄下的檔案:
[oracle@orcl2 myscript]$ ls
sqlldr1.ctl  sqlldr1.log
發現多出了一個.log檔案,沒有.bad檔案和.dsc檔案說明此次載入資料無任何的錯誤


在scott使用者下檢視錶中的資料資訊
SQL> select * from bonus;


ENAME                JOB                    SAL
-------------------- --------------- ----------
TOM                  EMP                    100
LALY                 EMP                    110
TOKE                 EMP                    120
JONE                 EMP                    130
JECL                 MGR                    140
JECK                 HR                     150
KULI                 MGR                    160


7 rows selected.
發現7條資料已完全載入如表中




從excel表中向資料庫匯入資料:


拿到一個excel表格,首先複製一份表格出來,以下操作均在備份表格中,以防原資料損壞


得到複製excel表格後,將其列頭和無關資料刪除後,點選檔案->另存為->儲存型別選擇csv(次格式的表格可以用記事本開啟,資料間用的是逗號分隔符),以記事本開啟剛儲存的csv的表格即得到你要的資料,此處我所得到的測試資料如下:
USER1,EMP,100
USER2,EMP,101
USER3,EMP,102
USER4,EMP,103
USER5,EMP,104
USER6,EMP,105
USER7,MGR,106
USER8,MGR,107
USER9,HR,108


編輯名為sqlldr2.ctl的控制檔案:
LOAD DATA
INFILE sqlldr2.dat       //指定載入的資料檔案路徑
APPEND INTO TABLE BONUS
FIELDS TERMINATED BY ","
(ENAME,JOB,SAL)
注:若要載入資料中含有自己指定的分隔符,可以在FIELDS TERMINATED BY ","後加上OPTIONALLY ENCLOSED BY '"'指定"為定界符
圖目錄下編輯名為sqlldr2.dat的資料檔案,加入剛才得到的逗號分隔符的資料
USER1,EMP,100
USER2,EMP,101
USER3,EMP,102
USER4,EMP,103
USER5,EMP,104
USER6,EMP,105
USER7,MGR,106
USER8,MGR,107
USER9,HR,108
開始載入資料:
[oracle@orcl2 sqlldr2]$ sqlldr scott/oracle control=sqlldr2.ctl 


SQL*Loader: Release 10.2.0.1.0 - Production on Tue Nov 19 10:45:40 2013


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


Commit point reached - logical record count 9
檢視錶中資料是否新增成功
SQL> select * from bonus;


ENAME                JOB                    SAL
-------------------- --------------- ----------
TOM                  EMP                    100
LALY                 EMP                    110
TOKE                 EMP                    120
JONE                 EMP                    130
JECL                 MGR                    140
JECK                 HR                     150
KULI                 MGR                    160
USER1                EMP                    100
USER2                EMP                    101
USER3                EMP                    102
USER4                EMP                    103


ENAME                JOB                    SAL
-------------------- --------------- ----------
USER5                EMP                    104
USER6                EMP                    105
USER7                MGR                    106
USER8                MGR                    107
USER9                HR                     108


16 rows selected.


載入無分隔符的資料


匯出測試資料
SQL> set linesize 60
SQL> set feedback off
SQL> set heading off
SQL> spool /u01/myscript/sqlldr3/sqlldr3.dat
SQL> select * from bonus;
TOM                  EMP                    100
LALY                 EMP                    110
TOKE                 EMP                    120
JONE                 EMP                    130
JECL                 MGR                    140
JECK                 HR                     150
KULI                 MGR                    160
USER1                EMP                    100
USER2                EMP                    101
USER3                EMP                    102
USER4                EMP                    103
USER5                EMP                    104
USER6                EMP                    105
USER7                MGR                    106
USER8                MGR                    107
USER9                HR                     108
SQL> spool off
SQL> set heading on
SQL> set feedback on


檢視匯出結果
[oracle@orcl2 sqlldr3]$ cat sqlldr3.dat 
SQL> select * from bonus;
TOM                  EMP                    100             
LALY                 EMP                    110             
TOKE                 EMP                    120             
JONE                 EMP                    130             
JECL                 MGR                    140             
JECK                 HR                     150             
KULI                 MGR                    160             
USER1                EMP                    100             
USER2                EMP                    101             
USER3                EMP                    102             
USER4                EMP                    103             
USER5                EMP                    104             
USER6                EMP                    105             
USER7                MGR                    106             
USER8                MGR                    107             
USER9                HR                     108       
將首行的SQL語句刪除 
將原表中的資料刪除
SQL> truncate table bonus;


Table truncated.


SQL> select * from bonus;


no rows selected


編寫控制檔案sqlldr3.ctl內容如下:
LOAD DATA
INFILE sqlldr3.dat
TRUNCATE INTO TABLE BONUS
(
ENAME POSITION(1:15),     //指定擷取從第一個字元開始到第十五個結束,其間的字元作為ENAME載入到資料庫,下同
JOB POSITION(22:40),
SAL POSITION(44:60)
)
匯入資料:
[oracle@orcl2 sqlldr3]$ sqlldr scott/oracle control=sqlldr3.ctl 


SQL*Loader: Release 10.2.0.1.0 - Production on Tue Nov 19 11:27:22 2013


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


Commit point reached - logical record count 16
[oracle@orcl2 sqlldr3]$ ls
sqlldr3.ctl  sqlldr3.dat  sqlldr3.log


檢視資料匯入情況


SQL> select * from bonus;


ENAME                JOB                    SAL
-------------------- --------------- ----------
TOM                  EMP                    100
LALY                 EMP                    110
TOKE                 EMP                    120
JONE                 EMP                    130
JECL                 MGR                    140
JECK                 HR                     150
KULI                 MGR                    160
USER1                EMP                    100
USER2                EMP                    101
USER3                EMP                    102
USER4                EMP                    103


ENAME                JOB                    SAL
-------------------- --------------- ----------
USER5                EMP                    104
USER6                EMP                    105
USER7                MGR                    106
USER8                MGR                    107
USER9                HR                     108


16 rows selected.




16行資料完全匯入成功!


未完待續。。。








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