2006年08月14日

ORACLE SQLLDR簡介

使用時機多半是用來把其他的資料庫的資料、文字檔匯入oracle中,或是把較舊的oracle板本裡的資料匯入較新的板本中

測試環境
OS:win2000
ORACLE:10.0.2

操作重點
1、確認執行動作的用戶有權限進行
2、目地table要先建立
3、control檔內容要正確

操作流程
1、建立control檔
load data (宣告開始)
infile "test.dat" (匯入的資料檔)
badfile "bad.log" (放資料格式不符合的)
discardfile "discard.log" (放不符合過濾絛件的)
into table test1 (資料存放的table)
fields terminated by ',' optionally enclosed by '"' (資料要怎樣分割)
trailing nullcols
( t1 char
, t2 char
)

2、建立要匯入資料的測試資料
1,"test1"
2,"test2"
3,"test3"

3、建立table
create table test1 (t1 int ,t2 char);

4、進行匯入
E:\sqlldr>sqlldr bcde/bcde control=test.ctl
SQL*Loader: Release 10.2.0.1.0 - Production on 星期一 8月 14 12:01:05 2006

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

已達確認點 - 邏輯記錄計數 3

5、查看
SQL> select * from test1;

沒有任何資料列被選取

6、怎會沒有資料呢,這時要先查看test.log
SQL*Loader: Release 10.2.0.1.0 - Production on 星期一 8月 14 12:01:05 2006

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

控制檔:        test.ctl
資料檔:        test.dat
  不良檔案:     bad.log
  捨棄檔案: discard.log
 (可以捨棄全部)

要載入的數目: ALL
要略過的數目:   0
可容許的錯誤:   50
連結陣列:       64 列, 上限為 256000 個位元組
繼續:     未設定
使用的路徑:       傳統

表格 TEST1, 載入 自每一個邏輯記錄.
這個表格的有效插入選項: INSERT
TRAILING NULLCOLS 選項處於有效狀態

   資料欄名稱                  位置       長度 項目 Encl 資料類型
------------------------------ ---------- ----- ---- ---- ---------------------
T1                                  FIRST     *   ,  O(") CHARACTER           
T2                                   NEXT     *   ,  O(") CHARACTER           

記錄 1: 被拒 - 表格 TEST1, 資料欄 T2 發生錯誤
ORA-12899: 資料欄 "BINHU"."TEST1"."T2" 的值太大 (實際: 5, 最大值: 1)

記錄 2: 被拒 - 表格 TEST1, 資料欄 T2 發生錯誤
ORA-12899: 資料欄 "BINHU"."TEST1"."T2" 的值太大 (實際: 5, 最大值: 1)

記錄 3: 被拒 - 表格 TEST1, 資料欄 T2 發生錯誤
ORA-12899: 資料欄 "BINHU"."TEST1"."T2" 的值太大 (實際: 5, 最大值: 1)


表格 TEST1:
  已順利載入 0 資料列.
  由於資料錯誤, 3 資料列 未被載入
  因為所有的 WHEN 子句均不成立, 0 資料列 未被載入
  因為所有的欄位均為 NULL, 0 資料列 未被載入


分配給連結陣列的空間:                             33024 個位元組 (64 列)
讀取   緩衝區位元組: 1048576

略過的邏輯記錄總數:                      0
讀取的邏輯記錄總數:                      3
拒絕的邏輯記錄總數:                      3
刪除的邏輯記錄總數:                      0

自 星期一 8月  14 12:01:05 2006 開始執行
於 星期一 8月  14 12:01:10 2006 結束執行

目前歷時:            00:00:04.82
CPU 時間為:          00:00:00.09
原來是資料欄位格式不對啊;而你可以查看bad.log檔,可以看到三行資料

7、修改資料欄位
SQL> alter table test1 modify t2 char(10);

已更改表格.

8、再進行匯入動作
E:\sqlldr>sqlldr binhu/2gxirdll control=test.ctl

SQL*Loader: Release 10.2.0.1.0 - Production on 星期一 8月 14 12:01:05 2006

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

已達確認點 - 邏輯記錄計數 3

E:\sqlldr>sqlldr binhu/2gxirdll control=test.ctl

SQL*Loader: Release 10.2.0.1.0 - Production on 星期一 8月 14 12:05:51 2006

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

已達確認點 - 邏輯記錄計數 3

9、查看資料真的有進來了嗎
SQL> select * from test1;

        T1 T2
---------- --------------------
         1 test1
         2 test2
         3 test3

SQL> desc test1;
 名稱                                       空值?    類型
 ----------------------------------------- -------- ----------------------------
 T1                                                 NUMBER(38)
 T2                                                 CHAR(10)

10、附上log檔
SQL*Loader: Release 10.2.0.1.0 - Production on 星期一 8月 14 12:05:51 2006

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

控制檔:        test.ctl
資料檔:        test.dat
  不良檔案:     bad.log
  捨棄檔案: discard.log
 (可以捨棄全部)

要載入的數目: ALL
要略過的數目:   0
可容許的錯誤:   50
連結陣列:       64 列, 上限為 256000 個位元組
繼續:     未設定
使用的路徑:       傳統

表格 TEST1, 載入 自每一個邏輯記錄.
這個表格的有效插入選項: INSERT
TRAILING NULLCOLS 選項處於有效狀態

   資料欄名稱                  位置       長度 項目 Encl 資料類型
------------------------------ ---------- ----- ---- ---- ---------------------
T1                                  FIRST     *   ,  O(") CHARACTER           
T2                                   NEXT     *   ,  O(") CHARACTER           


表格 TEST1:
  已順利載入 3 資料列.
  由於資料錯誤, 0 資料列 未被載入
  因為所有的 WHEN 子句均不成立, 0 資料列 未被載入
  因為所有的欄位均為 NULL, 0 資料列 未被載入


分配給連結陣列的空間:                             33024 個位元組 (64 列)
讀取   緩衝區位元組: 1048576

略過的邏輯記錄總數:                      0
讀取的邏輯記錄總數:                      3
拒絕的邏輯記錄總數:                      0
刪除的邏輯記錄總數:                      0

自 星期一 8月  14 12:05:51 2006 開始執行
於 星期一 8月  14 12:05:56 2006 結束執行

目前歷時:            00:00:04.75
CPU 時間為:          00:00:00.09

心得:
除了可做單純的匯入之外,你還可以在匯入時加入判斷條件,讓特定的資料到指定的table中,等以後我有需要處理時再把流程跟大家分享了

Posted by my_work at 樂多Roodo! │12:26 │回應(2)引用(1)DB
樂多分類:網路/3C 共同主題:Oracle 工具:編輯本文
Ads by Roodo! 

引用URL

http://cgi.blog.roodo.com/trackback/2015107
引用列表:
SQLLDR 是拿來匯入資料用的。使用之前,必須確認目的地 table 已經建好了。還有 control file 滿重要的。宣稱 direct path 的匯入方式速度很快。今天有一個資料檔,裡面是 NBA 球員的資料。(我從 NBA Li
Oracle SQLLDR 的初步認識【自爆前別忘了帶走我的青春】 at 2006年11月16日 17:06
回應文章
您好~
請問一下喔~trailing nullcols
是什麼意思呢??他的功用是什麼呢??
Posted by 布雷克 at 2006年12月5日 21:47

一照上述板大所言!!
SQL LOAD 無法add Data格式入資料庫囉??
Posted by Phoenix at 2008年03月21日 12:00