塗抹ORACLE-第5章-SQL*Loader 之一千零一十一個怎麼辦(2)
5.3.5 資料檔案中的列比要匯入的表中列少怎麼辦
提出這樣的問題,說明你沒有認真看我們前面的示例,對,前面你睡著了,OK,那就清醒一下,重新檢視一下表結構:
SQL> DESC BONUS;
名稱 是否為空? 型別
---------------- -------- ----------------------------
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
SAL NUMBER
COMM NUMBER之前的諸多演示,正是在資料檔案中列比表中列要少的環境下建立的,這說明列少不怕,關鍵是看控制檔案中的配置。考慮下面一種情況,如果缺少的列必須賦值又怎麼辦呢?沒有關係,稍改下控制檔案即可,直接指定COMM列,並賦初始值0(這裡仍然引用ldr_case3.dat中的資料):
LOAD DATA
INFILE ldr_case3.dat
TRUNCATE INTO TABLE BONUS
(
ENAME position(1:5),
JOB position(7:15),
SAL position(17:20),
COMM "0"
)示例程式碼儲存為控制檔案ldr_case4.ctl。
執行SQLLDR命令:
F:\oracle\script>SQLLDR SCOTT/TIGER CONTROL=LDR_CASE4.CTL
SQL*Loader: Release 10.2.0.1.0 - Production on 星期三 3月 11 17:01:01 2009
Copyright (c) 1982, 2007, Oracle. All rights reserved.
達到提交點 - 邏輯記錄計數 3
達到提交點 - 邏輯記錄計數 4SQL*Plus中檢視匯入結果:
SQL> SELECT * FROM BONUS;
ENAME JOB SAL COMM
---------- ---------- ---------- -----------
SMITH CLEAK 3904 0
ALLEN SALESMAN 2891 0
WARD SALESMAN 3128 0
KING PRESIDENT 2523 0可以再玩兒點更有難度的,根據SAL的值設定COMM列的值,修改控制檔案如下:
LOAD DATA
INFILE ldr_case3.dat
TRUNCATE INTO TABLE BONUS
(
ENAME position(1:5),
JOB position(7:15),
SAL position(17:20),
COMM "substr(:SAL,1,1)"
)示例程式碼儲存為控制檔案ldr_case5.ctl。
執行SQLLDR命令:
F:\oracle\SCRIPT>SQLLDR SCOTT/TIGER CONTROL=LDR_CASE5.CTL
SQL*Loader: Release 10.2.0.1.0 - Production on 星期三 3月 11 17:13:59 2009
Copyright (c) 1982, 2007, Oracle. All rights reserved.
達到提交點 - 邏輯記錄計數 3
達到提交點 - 邏輯記錄計數 4SQL*Plus中檢視匯入結果:
SQL> SELECT * FROM BONUS;
ENAME JOB SAL COMM
---------- -------------------- ---------- ----------
SMITH CLEAK 3904 3
ALLEN SALESMAN 2891 2
WARD SALESMAN 3128 3
KING PRESIDENT 2523 2這裡COMM列的值根據SAL列值而定,我們通過一個SQL中的函式substr取SAL值的第一列,賦予COMM列,當然這只是一個示例,DBA可以根據實際需求進行適當的修改,通過SQL中的函式可以實現很多很有意思的轉換,也許能夠為你省下很大力氣,而且如果現有函式無法實現,甚至可以通過PL/SQL編寫自定義的函式,然後在SQLLDR的控制檔案中呼叫,呼叫方式與系統自帶函式方式完全相同,這樣就可以根據需求對要載入的列做更靈活的處理。
5.3.6 資料檔案中的列比要匯入的表中列多怎麼辦
如果資料檔案中的列比要匯入的表中的列少,處理的時候可能麻煩些,多了反倒更簡單,針對不同情況,一般有以下兩種處理方式:
方式一:修改資料檔案,將多餘的資料刪除,不過以這種方式處理,小資料量時還算可行,一旦資料檔案較大,幾百兆甚至上千兆,修改資料檔案耗時耗力,這時我們就需要Plan B。
方式二:比如,資料檔案如下(同樣是基於只做演示的目的,這裡三思就不真的提供幾百兆甚至上千兆的資料了,不然出版社非把我活吞了不可):
SMITH 7369 CLERK 800 20
ALLEN 7499 SALESMAN 1600 30
WARD 7521 SALESMAN 1250 30
JONES 7566 MANAGER 2975 20
MARTIN 7654 SALESMAN 1250 30
BLAKE 7698 MANAGER 2850 30
CLARK 7782 MANAGER 2450 10
KING 7839 PRESIDENT 5000 10
TURNER 7844 SALESMAN 1500 30
JAMES 7900 CLERK 950 30
FORD 7902 ANALYST 3000 20
MILLER 7934 CLERK 1300 10示例程式碼儲存為資料檔案ldr_case6.dat。
我們希望匯入第1、3、4列而跳過2、5兩列(注意這裡指的不是字元列),建立控制檔案如下:
LOAD DATA
INFILE ldr_case6.dat
TRUNCATE INTO TABLE BONUS
(
ENAME position(1:6),
TCOL FILLER position(8:11),
JOB position(13:21),
SAL position(23:26)
)示例程式碼儲存為控制檔案ldr_case6.ctl。
SQLLDR的控制檔案中對列定義時支援FILLER關鍵字,可以用來指定過濾列,在上述控制檔案中,我們就使用該關鍵字來過濾列,相當於第8到第11列之間的資料不匯入。
事實上由於此處為定長字串,我們在控制檔案中指定的position引數,已經限定了讀取的內容,你甚至可以刪除控制檔案中TCOL FILLER position(8:11)那行。
執行SQLLDR命令:
F:\oracle\script>SQLLDR SCOTT/TIGER CONTROL=LDR_CASE6.CTL
SQL*Loader: Release 10.2.0.1.0 - Production on 星期三 3月 11 23:13:33 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
達到提交點 - 邏輯記錄計數 11
達到提交點 - 邏輯記錄計數 12SQL*Plus中檢視匯入結果:
SQL> SELECT * FROM BONUS;
ENAME JOB SAL COMM
---------- --------- --------- ----------
SMITH CLERK 800
ALLEN SALESMAN 1600
WARD SALESMAN 1250
JONES MANAGER 2975
MARTIN SALESMAN 1250
BLAKE MANAGER 2850
CLARK MANAGER 2450
KING PRESIDENT 5000
TURNER SALESMAN 1500
JAMES CLERK 950
FORD ANALYST 3000
MILLER CLERK 1300結果符合要求,不過,如果資料檔案中字串不是定長格式,而是通過分隔符來處理的,那控制檔案中就需要注意,如資料檔案如下:
SMITH,7369,CLERK,800,20
ALLEN,7499,SALESMAN,1600,30
WARD,7521,SALESMAN,1250,30
JONES,7566,MANAGER,2975,20
MARTIN,7654,SALESMAN,1250,30
BLAKE,7698,MANAGER,2850,30
CLARK,7782,MANAGER,2450,10
KING,7839,PRESIDENT,5000,10
TURNER,7844,SALESMAN,1500,30
JAMES,7900,CLERK,950,30
FORD,7902,ANALYST,3000,20
MILLER,7934,CLERK,1300,10示例程式碼儲存為資料檔案ldr_case7.dat。
建立控制檔案,此時控制檔案中必須指定FILLER,不然列值就有可能不對應。例如,建立控制檔案如下:
LOAD DATA
INFILE ldr_case7.dat
TRUNCATE INTO TABLE BONUS
FIELDS TERMINATED BY ","
(ENAME,TCOL FILLER,JOB,SAL)
示例程式碼儲存為控制檔案ldr_case7.ctl。執行SQLLDR命令:
F:\oracle\script>SQLLDR SCOTT/TIGER CONTROL=LDR_CASE7.CTL
SQL*Loader: Release 10.2.0.1.0 - Production on 星期三 3月 11 23:27:21 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
達到提交點 - 邏輯記錄計數 11
達到提交點 - 邏輯記錄計數 12SQL*Plus中檢視匯入結果:
SQL> SELECT * FROM BONUS;
ENAME JOB SAL COMM
---------- --------- --------- ----------
SMITH CLERK 800
ALLEN SALESMAN 1600
WARD SALESMAN 1250
JONES MANAGER 2975
MARTIN SALESMAN 1250
BLAKE MANAGER 2850
CLARK MANAGER 2450
KING PRESIDENT 5000
TURNER SALESMAN 1500
JAMES CLERK 950
FORD ANALYST 3000
MILLER CLERK 1300竣工~~~
=================================================
全書目錄:http://space.itpub.net/7607759/viewspace-622699
樣書預覽:http://space.itpub.net/7607759/viewspace-622515
馬上購買:http://www.china-pub.com/196252
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7607759/viewspace-623704/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 塗抹ORACLE-第5章-SQL*Loader 之一千零一十一個怎麼辦(3)OracleSQL
- 塗抹ORACLE-第8章-Rman說,我能備份(1) 進入RMANOracle
- 塗抹ORACLE--第1章ORACLE傳奇(2)Oracle
- 塗抹ORACLE--第1章ORACLE傳奇(3)Oracle
- 塗抹ORACLE--第1章ORACLE傳奇(1)Oracle
- 塗抹ORACLE--第16章--資料庫物理儲存結構(2)Oracle資料庫
- 《塗抹MySQL》目錄MySql
- 塗抹ORACLE--序言之精彩不止一兩抹~Oracle
- 塗抹ORACLE全書目錄~Oracle
- 塗抹MySQL自序 - 輪扁斫輪MySql
- 塗抹ORACLE--第16章--資料庫物理儲存結構(4)Oracle資料庫
- 塗抹ORACLE--第16章--資料庫物理儲存結構(1)Oracle資料庫
- 塗抹MySQL--第1章 開源運動與開源軟體MySQL - 1.2MySQL的悄然而至(2)MySql
- 塗抹MySQL--第1章 開源運動與開源軟體MySQL - 1.1開源軟體的故事(2)MySql
- 塗抹MySQL--第5章 MySQL資料庫中的許可權體系 - 5.3許可權級別(2)MySql資料庫
- SQL跑得太慢怎麼辦?SQL
- 塗抹MySQL--第5章 MySQL資料庫中的許可權體系 - 5.2許可權授予與回收(2)MySql資料庫
- 塗抹MySQL--第5章 MySQL資料庫中的許可權體系 - 5.4帳戶安全管理MySql資料庫
- ITPUB名人堂第25期:oracle技術分享達人李丙洋(ID: junsansi)帶你塗抹OracleOracle
- SQL LOADERSQL
- 【聽海日誌】之Oracle SQL*LOADEROracleSQL
- Oracle-常用監控SQLOracleSQL
- 塗抹MySQL--第1章 開源運動與開源軟體MySQL - 1.2MySQL的悄然而至(4)MySql
- 塗抹MySQL--第1章 開源運動與開源軟體MySQL - 1.2MySQL的悄然而至(3)MySql
- 塗抹MySQL--第1章 開源運動與開源軟體MySQL - 1.2MySQL的悄然而至(1)MySql
- 塗抹MySQL--第1章 開源運動與開源軟體MySQL - 1.1開源軟體的故事(3)MySql
- 塗抹MySQL--第1章 開源運動與開源軟體MySQL - 1.1開源軟體的故事(1)MySql
- 塗抹MySQL--第5章 MySQL資料庫中的許可權體系 - 5.3許可權級別(1)MySql資料庫
- 塗抹MySQL--第5章 MySQL資料庫中的許可權體系 - 5.3許可權級別(3)MySql資料庫
- webpack系列之四loader詳解2Web
- oracle sql*loader批量匯入多個CSVOracleSQL
- 碰到一個爛人怎麼辦
- 24-分析要點:怎麼辦(2)
- 塗抹MySQL--第5章 MySQL資料庫中的許可權體系 - 5.2許可權授予與回收(3)MySql資料庫
- 塗抹MySQL--第5章 MySQL資料庫中的許可權體系 - 5.2許可權授予與回收(1)MySql資料庫
- SQL*Loader 詳解SQL
- Oracle SQL Loader(sqlldr)OracleSQL
- sql loader使用例子SQL