DB2中所謂的數據移動,包括:
1. 數據的導入(Import)
2. 數據的導出(Export)
3. 數據的裝入(Load)
導入和裝入都是利用DB2的相關命令把某種格式的文件中的數據保存到數據庫中的表中
導出是指把DB2數據庫的表中的數據保存到某種格式的文件當中去
數據移動的作用:
如果要在不同的數據庫管理系統之間轉移數據,數據移動通常是最實用的一種方法,因為任何一種數據庫管理系統都支持常用的幾種文件格式,通過這個通用的接口,就很容易實現不同系統間數據的轉移。
這三個命令中,Export最簡單,因為從表中向文件轉移數據,通常不會出現錯誤,也不會有非法的數據。
在講解命令之前,首先介紹一下文件的格式,用於DB2數據移動的文件格式有四種:
1. ASC——非定界ASCII文件,是一個ASCII字符流。數據流中的行由行定界符分隔,而行中的每一列則通過起始和結束位置來定義。例如:
10 Head Office 160 Corporate New York
15 New England 50 Eastern Boston
20 Mid Atlantic 10 Eastern Washington
38 South Atlantic 30 Eastern Atlanta
42 Great Lakes 100 Midwest Chicago
51 Plains 140 Midwest Dallas
66 Pacific 270 Western San Francisco
84 Mountain 290 Western Denver
2. DEL——定界ASCII文件,也是一個ASCII字符流。數據流中的行由行定界符分隔,行中的列值由列定界符分隔。文件類型修飾符可用於修改這些定界符的默認值。例如:
10,"Head Office",160,"Corporate","New York"
15,"New England",50,"Eastern","Boston"
20,"Mid Atlantic",10,"Eastern","Washington"
38,"South Atlantic",30,"Eastern","Atlanta"
42,"Great Lakes",100,"Midwest","Chicago"
51,"Plains",140,"Midwest","Dallas"
66,"Pacific",270,"Western","San Francisco"
84,"Mountain",290,"Western","Denver"
3. WSF——(work sheet format)為工作表格式,用於與Lotus系列的軟件進行數據交換。
4. PC/IXF——是集成交換格式(Integration Exchange Format,IXF)數據交換體系結構的改編版本,由一些列可變長度的記錄構成,包括頭記錄、表記錄、表中每列的列描述符記錄以及表中每行的一條或多條數據記錄。PC/IXF 文件記錄由包含了字符數據的字段組成。
第一部分:數據的導出(Export)
例一:把Org表中的所有數據導出到文件C:ORG.TXT中。
Export to c:org.txt of del select * from org
其中,of del表示導出到的文件的類型,在本例中導出到一個非定界文本文件中;後面的select * from org是一個SQL語句,該語句查詢出來的結果就是要導出的數據。
例二:改變del格式文件的格式控制符
export to c:staff.txt of del modifIEd by coldel$ chardel'' decplusblank select * from staff
在該例中,modifIEd子句用於控制各種符號,coldel表示字段之間的間隔符,默認情況為逗號,現在改為$號;chardel表示字符串字段用什麼符號引用,默認情況下為一對雙引號括起來,現在改為用一對單引號括起來;decplusblank表示對於十進制數據類型,用空格代替最前面的加號,因為默認情況下會在十進制數據前面加上正負號的。
例三:以ASC格式將數據導出到文件
Export命令是不支持ASC格式文件的,所以如果想導出ASC這樣規整的格式,需要程序員自己進行轉換操作,思路是將各種數據類型都轉換成定長字符串,然後把各個要導出的字段合並成為一個字段。
例如創建如下結構的表n:
create table n(a int,b date,c time,d varchar(5),e char(4),f double)
然後插入兩條數據:
insert into n values(15,'2004-10-21','23:12:23','abc','hh',35.2)
insert into n values(5,'2004-1-21','3:12:23','bc','hhh',35.672)
要想把這兩條數據以規整的格式導出到文件中,進行如下操作:
export to c: est.txt of del select char(a) || char(b) || char(c) || char(d,5) || e || char(f) as tmp from n
這樣導出的結果與ASC格式的文件非常類似,只是每一行的前後多出了一對雙引號,對此我們可以使用文本工具(如寫字板、記事本等)把雙引號刪除掉,也可以置之不理,在以後導入的時候直接控制格式(忽略雙引號)
在文件中的格式為:
"15 2004-10-2123.12.23abc hh 3.52E1 "
"5 2004-01-2103.12.23bc hhh 3.5672E1 "
例四:大數據的導出
export to d:myfile.del of del lobs to d:lob lobfile lobs modifIEd by lobsinfile select * from emp_photo
該命令把emp_photo表的數據導出到d:myfile.del文件中,其結果為:
"000130","bitmap","lobs.001.0.43690/"
"000130","gif","lobs.001.43690.29540/"
"000130","xwd","lobs.001.73230.45800/"
"000140","bitmap","lobs.001.119030.71798/"
"000140","gif","lobs.001.190828.29143/"
"000140","xwd","lobs.001.219971.73908/"
"000150","bitmap","lobs.001.293879.73438/"
"000150","gif","lobs.001.367317.39795/"
"000150","xwd","lobs.001.407112.75547/"
"000190","bitmap","lobs.001.482659.63542/"
"000190","gif","lobs.001.546201.36088/"
"000190","xwd","lobs.001.582289.65650/"
其中第三個字段是BLOB類型,在該文件中只保存了一個標志,相當於一個指針,真正的LOB數據保存在d:lob目錄下的lobs.001、lobs.002、......等一系列文件中。命令中lobs to 後面指定大對象數據保存在什麼路徑下(注意,該路徑必須事先已經存在,否則會報錯),lobfile 後面指定大對象數據保存在什麼文件中,不要指定擴展名,DB2會根據數據量自動追加.001、.002等擴展名,同時不要忘記加上modifIEd by lobsinfile子句。
例五:把導出信息保存在消息文件中。
export to d:awards.ixf of ixf messages d:msgs.txt select * from staff where dept = 20
這個例子把staff表中dept=20的數據導出到d:awards.ixf文件中,所有的導出信息都保存在d:msgs.txt文件中(無論是成功、警告還是失敗信息),這樣,管理員可以通過觀察信息文件找到問題所在。
例六:給導出數據列重命名。
export to d:awards.ixf of ixf method n(c1,c2,c3,c4,c5,c6,c7) messages d:msgs.txt select * from staff where dept=20
在默認情況下,導出的每一列數據以表中對應的字段名自動命名,我們可以通過method n子句給每一列重新命名,需要注意的是,這個子句只在ixf和wsf格式文件中有效,在文本文件中不能使用。