天地不仁,以万物为刍狗!

DB2数据的导入和导出

上一篇 / 下一篇  2008-04-16 13:44:20 / 个人分类:db2

DB2中所谓的数据移动,包括:
1T ~i/iDh#eb01. 数据的导入(Import)ITPUB个人空间'W?c$Vg7kk
2. 数据的导出(Export)ITPUB个人空间Z'V)u0CLFwG
3. 数据的装入(Load)ITPUB个人空间4jb:v%mCg.d4Z-m^)}rG
ITPUB个人空间 v o? PZ @
导入和装入都是利用DB2的相关命令把某种格式的文件中的数据保存到数据库中的表中
XE+P,lc+^1g2z0导出是指把DB2数据库的表中的数据保存到某种格式的文件当中去ITPUB个人空间&e:lPrUpL\F
ITPUB个人空间!x+q.kt gGlQ(} jg
数据移动的作用:ITPUB个人空间U8tP;lYa
ITPUB个人空间K9^N6zcIz-] b
如果要在不同的数据库管理系统之间转移数据,数据移动通常是最实用的一种方法,因为任何一种数据库管理系统都支持常用的几种文件格式,通过这个通用的接口,就很容易实现不同系统间数据的转移。ITPUB个人空间n1K#E8xe$B
ITPUB个人空间~khG8tQC
这三个命令中,Export最简单,因为从表中向文件转移数据,通常不会出现错误,也不会有非法的数据。ITPUB个人空间.{ R!YE$T?p Y9RP
ITPUB个人空间f7OP[(Q
在讲解命令之前,首先介绍一下文件的格式,用于DB2数据移动的文件格式有四种:
gJ0Xa!}4T01. ASC——非定界ASCII文件,是一个ASCII字符流。数据流中的行由行定界符分隔,而行中的每一列则通过起始和结束位置来定义。例如:
:i?L;G*q0xC0
&GPq NrdL8~8T010   Head Office     160   Corporate   New YorkITPUB个人空间f,o5g)AU7CMA
15   New England  50     Eastern       BostonITPUB个人空间)kC+Pm otV)cU%U
20   Mid Atlantic     10     Eastern       WashingtonITPUB个人空间DF:}*? LT+~t
38   South Atlantic 30     Eastern       Atlanta
Q*eK L j-zV.D042   Great Lakes    100   Midwest      ChicagoITPUB个人空间4~*R^:oW"i
51   Plains              140   Midwest      DallasITPUB个人空间$} L%_/By yzl
66   Pacific              270   Western     San FranciscoITPUB个人空间7[+Wf*|(`N
84   Mountain         290   Western     Denver
f%nmfT7}9[3J0ITPUB个人空间"Rl!zuDW j lg
2. DEL——定界ASCII文件,也是一个ASCII字符流。数据流中的行由行定界符分隔,行中的列值由列定界符分隔。文件类型修饰符可用于修改这些定界符的默认值。例如:ITPUB个人空间)tmh*? o \ g
ITPUB个人空间4uk5\]'Y8z
10,"Head Office",160,"Corporate","New York"
-R,G8V*C.v#wAkC s015,"New England",50,"Eastern","Boston"ITPUB个人空间.|k#\ w:[4{3j
20,"Mid Atlantic",10,"Eastern","Washington"
%A-L'SzFW%[t*u)^d038,"South Atlantic",30,"Eastern","Atlanta"
'a l(J.c#_R8t&a042,"Great Lakes",100,"Midwest","Chicago"
mHn MV&}051,"Plains",140,"Midwest","Dallas"
i4j}?$M,S;@7Sk D \066,"Pacific",270,"Western","San Francisco"
YH~6Sx'[V/Oda?084,"Mountain",290,"Western","Denver"ITPUB个人空间tSEr*xU9wx
ITPUB个人空间8J+m5` Gp
3. WSF——(work sheet format)为工作表格式,用于与Lotus系列的软件进行数据交换。ITPUB个人空间/Iy+{~/Ez%u

@LU"yKb M-R9pK-ur04. PC/IXF——是集成交换格式(Integration Exchange Format,IXF)数据交换体系结构的改编版本,由一些列可变长度的记录构成,包括头记录、表记录、表中每列的列描述符记录以及表中每行的一条或多条数据记录。PC/IXF 文件记录由包含了字符数据的字段组成。
lTD*Lu@A-f0
Zf2x9M/y&pZ^1E7gG0第一部分:数据的导出(Export)
'x!jhl*M%S l0例一:把Org表中的所有数据导出到文件C:\ORG.TXT中。ITPUB个人空间&Z'bd\m_ }
Export to c:\org.txt of del select * from org
d$qQ#w J1T.U0ITPUB个人空间Ci(qvF _
其中,of del表示导出到的文件的类型,在本例中导出到一个非定界文本文件中;后面的select * from org是一个SQL语句,该语句查询出来的结果就是要导出的数据。ITPUB个人空间x e M)iT$]0f3vx
ITPUB个人空间 |z:Re:r
例二:改变del格式文件的格式控制符ITPUB个人空间%\?^N*?${9eX
export to c:\staff.txt of del modified by coldel$ chardel'' decplusblank select * from staffITPUB个人空间+_Zh'xw
在该例中,modified子句用于控制各种符号,coldel表示字段之间的间隔符,默认情况为逗号,现在改为$号;chardel表示字符串字段用什么符号引用,默认情况下为一对双引号括起来,现在改为用一对单引号括起来;decplusblank表示对于十进制数据类型,用空格代替最前面的加号,因为默认情况下会在十进制数据前面加上正负号的。ITPUB个人空间$E$_0DRg Y E @

q0{'d7Fg@ kC0例三:以ASC格式将数据导出到文件ITPUB个人空间k"~Z,B?$qN$?!pk
Export命令是不支持ASC格式文件的,所以如果想导出ASC这样规整的格式,需要程序员自己进行转换操作,思路是将各种数据类型都转换成定长字符串,然后把各个要导出的字段合并成为一个字段。ITPUB个人空间D"fV L!r"IL!nK_
例如创建如下结构的表n:ITPUB个人空间 k+^,Wc]6QeU
create table n(a int,b date,c time,d varchar(5),e char(4),f double)ITPUB个人空间0z1^9I}&`
然后插入两条数据:ITPUB个人空间,eG+~.u!nQ)l
insert into n values(15,'2004-10-21','23:12:23','abc','hh',35.2)
E'Y\da;q:s0insert into n values(5,'2004-1-21','3:12:23','bc','hhh',35.672)ITPUB个人空间'C$p*\:x&Tq(i j"A
要想把这两条数据以规整的格式导出到文件中,进行如下操作:ITPUB个人空间].T U0FR| R/|w7J+ZB
export to c:\test.txt of del select char(a) || char(b) || char(c) || char(d,5) || e || char(f) as tmp from nITPUB个人空间 b N)hI _e
这样导出的结果与ASC格式的文件非常类似,只是每一行的前后多出了一对双引号,对此我们可以使用文本工具(如写字板、记事本等)把双引号删除掉,也可以置之不理,在以后导入的时候直接控制格式(忽略双引号)
g"UC7J5Y,M0在文件中的格式为:
D/KT;^ YKox1d"e0
T1I$hsu@E0"15         2004-10-2123.12.23abc  hh  3.52E1                  "ITPUB个人空间"qX7k&@2ro7b+?
"5          2004-01-2103.12.23bc   hhh 3.5672E1                "ITPUB个人空间S:r)L/lx+lCQ

OK:E {:p"b0例四:大数据的导出ITPUB个人空间R`E5} |&Bi#D
export to d:\myfile.del of del lobs to d:\lob\ lobfile lobs modified by lobsinfile select * from emp_photoITPUB个人空间F#r g2|hasj
该命令把emp_photo表的数据导出到d:\myfile.del文件中,其结果为:
Zxn.rG/[k#J0<pre>;ITPUB个人空间#o#a:G#]:W:{]*y
"000130","bitmap","lobs.001.0.43690/"
YYmm n/v_$F0"000130","gif","lobs.001.43690.29540/"ITPUB个人空间 C.A E TP9@Swb}Ir
"000130","xwd","lobs.001.73230.45800/"ITPUB个人空间#T s2E0l*as2H z
"000140","bitmap","lobs.001.119030.71798/"
,Rv kYRxT']O0"000140","gif","lobs.001.190828.29143/"ITPUB个人空间K-k4emIP5hTy
"000140","xwd","lobs.001.219971.73908/"ITPUB个人空间_Gh^1i[&s,Jn0r
"000150","bitmap","lobs.001.293879.73438/"ITPUB个人空间$h2d q T;Dg+GN9{(t
"000150","gif","lobs.001.367317.39795/"ITPUB个人空间8CQtz q-fXO3W2{9~@
"000150","xwd","lobs.001.407112.75547/"
0dk't3N'y+B{I6o0"000190","bitmap","lobs.001.482659.63542/"ITPUB个人空间B)]OO u)n
"000190","gif","lobs.001.546201.36088/"
"M`_7MGA1W t0"000190","xwd","lobs.001.582289.65650/"
y#q,~1_ C#tP0</pre>;
j(J,X \V0其中第三个字段是BLOB类型,在该文件中只保存了一个标志,相当于一个指针,真正的LOB数据保存在d:\lob目录下的lobs.001、lobs.002、......等一系列文件中。命令中lobs to 后面指定大对象数据保存在什么路径下(注意,该路径必须事先已经存在,否则会报错),lobfile 后面指定大对象数据保存在什么文件中,不要指定扩展名,DB2会根据数据量自动追加.001、.002等扩展名,同时不要忘记加上modified by lobsinfile子句。ITPUB个人空间/` e*F@;}

%R7lE s:s:~%fy8g;Ek^n0例五:把导出信息保存在消息文件中。ITPUB个人空间2uQ2n%_-?#v:`
export to d:\awards.ixf of ixf messages d:\msgs.txt select * from staff where dept = 20ITPUB个人空间W,E`'Y5u7h.k2}k
这个例子把staff表中dept=20的数据导出到d:\awards.ixf文件中,所有的导出信息都保存在d:\msgs.txt文件中(无论是成功、警告还是失败信息),这样,管理员可以通过观察信息文件找到问题所在。
} UUVNnI]7p7g0ITPUB个人空间ECk/jg2Q[ H_
例六:给导出数据列重命名。
eUISc^$n,EJPW'Q0export to d:\awards.ixf of ixf method n(c1,c2,c3,c4,c5,c6,c7) messages d:\msgs.txt select * from staff where dept=20ITPUB个人空间5J+D;z!yO#\d8bg
在默认情况下,导出的每一列数据以表中对应的字段名自动命名,我们可以通过method n子句给每一列重新命名,需要注意的是,这个子句只在ixf和wsf格式文件中有效,在文本文件中不能使用。
数据的导入ITPUB个人空间A$hCu"~9m,]pv

$M-E$VX/o j0例七:把C盘根目录下的org.txt文件中的数据导入到org表中ITPUB个人空间G4xTi k}
import from c:\org.txt of del insert into org
]+_.AMwT0
'Wn$J*I4k0导入命令和导出命令的格式基本上处于对应的关系,import对应export,from对应to,文件名和文件格式代表的含义相同,但是导入命令支持ASC格式的文件,而导出命令不支持。另外,在导出命令的最后是一个SQL语句,用于选择要导出的数据,而导入命令最后不是SQL语句,而是插入数据的方式以及目标表名称。
v/vS~i#F0ITPUB个人空间M&m$@}*{? `_F
例八:从ASC格式文件中导入数据ITPUB个人空间 CYxd\6_2p
import from  c:\org2.txt of asc method l(1 5,6 19,20 25,26 37,38 50) insert into orgITPUB个人空间R8I9y$S8r!x9SJ#y A
其中 method l 子句用于指定文本文件中每一个字段的起始位置和终止位置,每个起始位置和终止位置间用空格分开,字段之间用逗号分开。ITPUB个人空间8o"X Nfs
除了l方法之外,还有n方法和p方法,下面会叙述。
C#R E@4TXWd4]&\ `0ITPUB个人空间)slB5O|*Ozw*Q&m
例九:利用n方法导入数据,并且创建新表。ITPUB个人空间6_2E?/QB!p
首先导出一个用例文件:
NuY(Ku)E;y0export to d:\org.ixf of ixf method n(a,b,c,d,e) select * from orgITPUB个人空间.m6p8oE;~*C:O
这样org.ixf文件中有五列数据,对应的列名分别为a、b、c、d、eITPUB个人空间VeS7q&~ a2d|
然后在从该文件中导入数据到一个新表中
9mTT0T'_6r0import from d:\org.ixf of ixf method n(d,e,b) replace_create into orgtest
+qF@oQ)@0该命令从文件中选取三列导入到表中,顺序可以不按照文件中原有的列的顺序。replace_create方式的叙述见下。
`.]p,?V4O#gy0ITPUB个人空间$L,M'~/R;\'zm OB
插入方式有:ITPUB个人空间m%bL ds7E/_
INSERT 方式——在表中现有数据的基础之上追加新的数据。
7fca-fmA-@0INSERT_UPDATE 方式——这种方式只能用于有主键的表,如果插入的数据与原有数据主键不冲突,则直接插入,如果主键冲突,则用新的数据代替原有数据。
*n w L%K8nb'fc e0REPLACE 方式——先把表中现有的数据都删除,然后向空表中插入数据。ITPUB个人空间*xj.S(M{rsb
REPLACE_CREATE 方式——表示如果表存在,则先把表中的数据都删除,然后向空表中插入数据;如果表不存在,则先根据文件中的字段创建表,然后再向表中插入数据。这种方式只能把IXF格式的文件中的数据插入到表中。
3fanI5cE\Q f7B@0
h I OrU^A:k0例十:利用p方法导入数据ITPUB个人空间` F"[ZFn*L
import from d:\org.ixf of ixf method p(4,5,2) replace into orgtestITPUB个人空间 B7OB*Wy-b,a
该例子执行的效果和例九类似,只是把n方法换成了p方法,p方法后面的列表中指明列的序号即可,不需要指明列名。另外,此例中使用了replace方式插入数据,这会把表中现有的数据都删除,然后向空表中插入数据。ITPUB个人空间lQ1~X P r5^6r#S
ITPUB个人空间$B1i b0yk#_/m,V
例十一:关于空值的导入ITPUB个人空间1| qX;u}:z e
对于ixf格式的文件,导入空值非常方便,因为里面已经记录了空值的信息。但是,对于ASC格式文件就有一定的难度了,因为DB2会直接插入空格,而不是空值。为此,DB2提供了一个子句进行控制:NULL INDICATORSITPUB个人空间$P({e IuY-x
ITPUB个人空间 D3EG L(Z+tj,d7u p"|
import from  c:\org2.txt of asc MODIFIED BY nullindchar=# method l(1 5,6 19,20 25,26 37,38 50) NULL INDICATORS(0,0,0,0,38 ) replace into org
2u;F(t{-f8LK-I Q"O#b"L[0
{ohr? J%Z`y0在这个例子中,NULL INDICATORS子句后面是一个列表,表示前面四个字段都不会存在空值,而第五个字段从38列开始,可能存在空值,而 MODIFIED BY nullindchar=# 子句表示在文件中第五个字段如果遇到 # 号,则表示为空值。
$MC]WTnE1S+S {0ITPUB个人空间F} D!O{7m H6W4G[
就说这些吧,抛砖引玉,希望大家补充,下一次谈一谈Load命令。
ITPUB个人空间{CU0]6`!H^ K
装入(Load)ITPUB个人空间tJ3QppyEk
ITPUB个人空间^*\{,? n;{"T+U
装入命令格式与导入类似,命令关键字是Load,但是后面的参数比导入命令多的多,详细用法可以自行参考DB2文档。
TH\,E u/h0
ZA0@4uw5Qo0装入与导入类似,都是将输入文件中的数据移入到目标表中,二者的不同点将在实例中逐步解释。
F%r\9uc|(vZ)D"l0
$@ IWUO Q:A0在装入之前,目标表必须已经存在。ITPUB个人空间u VD1ea Nd'`4D9Nc
ITPUB个人空间I b*k?h2H9? fq
装入的性能比导入高,原因在后面结合实例详细解释。
`@+[1Z:@ypgn0
n%i Et#|Q;T0装入操作不记录到日志中,所以不能使用日志文件进行前滚操作。ITPUB个人空间HF gAl${ u

Px5Yc#r$vd-Sk0装入分为4个阶段:
8Ic@#M&k]+og01. 装入阶段
"}&U?-qGR/S;e4e0在这个阶段发生两件事:数据存储在表中,收集索引键并排序。在装入时,DBA可以指定多长时间生成一致点。ITPUB个人空间F O`'M8^l }2S.w[

&_E#M ~2m8Z?p0它是装入工具的检查点。如果装入在执行期间被打断,它可以从最后一个一致点处开始继续重新执行。ITPUB个人空间e.R \Une

5exu7D$Z O#l,s8\6w F02. 构建阶段ITPUB个人空间i WOba
在构建阶段,基于在装入阶段收集的索引键信息创建索引。如果在构建阶段发生错误,装入工具就重启,它将从构建阶段开始处重新开始构建。
[ Z:V ^.F`)w/ab#k,f7Wj0ITPUB个人空间f_$DW Z.n*z `
3. 在删除阶段,所有违反唯一或主键约束的行都被删除并拷贝到一个异常表(如果在语句中指定相应选项)中。当输入行被拒绝,消息文件中就生成消息。ITPUB个人空间b#M)P}u0Y`/g
ITPUB个人空间'a\v1xZ?
4. 索引拷贝阶段ITPUB个人空间,O6wl.s(\&Pu Z
如果在装入操作期间为索引创建指定了系统临时表空间,并且选择了 READ ACCESS 选项,该索引数据将从系统临时表空间拷贝到原来的表空间。
#vs/l0OVrOA*o0ITPUB个人空间c9@9pjb
装入过程的所有四个阶段都是操作的一部分,只有在所有的四个阶段都完成之后,该装入操作才算完成。在每个阶段都将生成消息,一旦其中的某个阶段发生错误,这些消息可以帮助DBA分析并解决问题。
W,]9z#@/S"J9m0
DrT9x!zt/]0S0导入操作每次插入一行数据时都要检查是否满足约束条件,并且记入日志文件中。
/g&?1C}3zA0
fPG | rUR+}.a0ITPUB个人空间:AT#K"S8}k
下面我们看一些LOAD命令特有的功能,IMPORT命令也能做的就不再详细说了。
Y p~$V9_l}kl0
)GQ1ib$Bg V0例十二:从光标类型文件中进行装入ITPUB个人空间3B'bp1^Y-z
定义一个cursorITPUB个人空间@E%w+p*T8z5v
declare mycur cursor for select * from org
d2z ^b4Odu#p)O0创建一个新表,结构与cursor相容ITPUB个人空间g3AN%~[6a0SM*O
create table org2 like orgITPUB个人空间kd7V j S i&}
从cursor中装入ITPUB个人空间+u P?-` oWTq
load from mycur of cursor insert into org2ITPUB个人空间!a&]fe)i{$` J
ITPUB个人空间@$E;y*t#Q3F(C
除了可以从cursor中装入,还可以从文件、管道、设备中进行装入。而导入命令只能从文件中导入。
*KP|e D)S0
oQ*g k#m%UW0ITPUB个人空间7G,|!cj}7E
ITPUB个人空间AN1Et d3n0im
例十三:关于异常表
"@6zl ?;p'a0D0由用户定义的异常表可以用于存储不遵循唯一约束和主码约束的行。如果装入的时候没有指定异常表,则违反唯一约束的行将被丢弃并且将不再有机会恢复或修改。
]Gbxe&d0用SAMPLE数据库中的STAFF表做实验
,y QEc$j RWl*O01. 创建一个结构与STAFF表相同的表STAFF1ITPUB个人空间Os8w#[1Jvb TyRF
CREATE TABLE STAFF1 LIKE STAFFITPUB个人空间 R%D9`H ca
ITPUB个人空间0n%nM q#po
2. 把STAFF表中的一部分数据插入到STAFF1中
n|(q5w8dYVw!c|0INSERT INTO STAFF1 SELECT * FROM STAFF WHERE ID<=160
3vj/]$dw z W,m*K0
G5r}V:d*T:u03. 再创建一个结构与STAFF1相同的表STAFFEXP,作为异常表
'W#u~$E Fxg*eF0CREATE TABLE STAFFEXP LIKE STAFF1ITPUB个人空间J#LI-fx#]8U!u

'u h1B+V \7}%W `m;B04. 给该异常表添加一列,因为异常表和普通表相比,前面的结构都相同,就是最后多出一列或两列(列名任意),第一列是时间戳类型,记录异常记录插入的时间,第二列是大文本类型(至少为32K大小),保存导致该条记录被拒绝的特定约束信息。本例中只添加一个时间戳列。ITPUB个人空间$QzC t7J+f}G T
ALTER TABLE STAFFEXP ADD COLUMN TIME TIMESTAMP
(nr&[Ai%S9awy0
&F4Di4?[*Tl3k8^'F05. 为STAFF1表创建一个唯一索引
2~ E@0D k!O9J%vo0CREATE UNIQUE INDEX IDXSTAFF ON STAFF1(ID)
{AJ'D|0
0VJB7gw(F$?(}06. 先运行导出命令做出一个文本文件ITPUB个人空间8^*e FwPtqE
EXPORT TO D:\STAFF.TXT OF DEL SELECT * FROM STAFF
&?7L g Tj7}5r2r0ITPUB个人空间#X5?)UM6o`(g R
7. 然后运行装入命令把数据再装入到STAFF1表中ITPUB个人空间}|q^CR|
LOAD FROM D:\STAFF.TXT OF DEL INSERT INTO STAFF1 FOR EXCEPTION STAFFEXPITPUB个人空间C:u5rEc8L;~f9W
ITPUB个人空间"_vZP*h*_DqF@
由于表STAFF1中有唯一索引,所以会有一部分数据因为违反这个约束条件而不能插入到STAFF1表中,这些记录就会插入到异常表STAFFEXP中。ITPUB个人空间mB{.p(H5nC-J+D
ITPUB个人空间h"Jek IK.n d
注意一点,异常表必须自己先定义好,装入命令不能够自动生成异常表,如果找不到指定的异常表,就会报错。ITPUB个人空间-K*yFK6jAy
ITPUB个人空间F7xm-Lf-|'W,[

a k L0pQXE0
t:E$L$n&Kn!AF0例十四:关于DUMP文件
w:u/Q/vMJ`0格式不正确的行会被拒绝。通过指定DUMPFILE文件类型修饰符可以使这些被拒绝的记录单独放在指定的文件里。ITPUB个人空间GSH9v;tC
用SAMPLE数据库中的STAFF表做实验ITPUB个人空间}j-d)d%]oCM6k2E
1. 创建一个结构与STAFF表相同的表STAFF1ITPUB个人空间+Gf]'}U3co(H^v
CREATE TABLE STAFF1 LIKE STAFF
bC T:W5L)Xv&g0
n|9yP$?F b0gj N02. 把STAFF表中的一部分数据插入到STAFF1中
/@$U2w X r P;FG0INSERT INTO STAFF1 SELECT * FROM STAFF WHERE ID<=160
)m0l#K|f'r8zQ"r(g0
Q gZ"w8u'L1r@03. 再创建一个结构与STAFF1相同的表STAFFEXP,作为异常表ITPUB个人空间b1K&m%dXr
CREATE TABLE STAFFEXP LIKE STAFF1ITPUB个人空间.n~ Ja4T~

eY*rG6p%`,D04. 给该异常表添加一列
e9WT,u/~ A-D u0ALTER TABLE STAFFEXP ADD COLUMN TIME TIMESTAMPITPUB个人空间6][ t3C~0r'g`
ITPUB个人空间i}kcyqyQ
5. 为STAFF1表创建一个唯一索引
V s$i VC0CREATE UNIQUE INDEX IDXSTAFF ON STAFF1(ID)
+wiY!D dk0
?m1A!htn8YMc06. 先运行导出命令做出一个文本文件ITPUB个人空间'j ry~.S m;A)I
EXPORT TO D:\STAFF.TXT OF DEL SELECT * FROM STAFF
N9s N,\#g7Q.`0到D盘上打开STAFF.TXT文件,把第一列等于320的行替换为:"abcf","aaa","sdfg"
mk:b jw'\TZY0ITPUB个人空间8S:JD.{9M P ?
7. 然后运行装入命令把数据再装入到STAFF1表中ITPUB个人空间4u{s4R,H5su
LOAD FROM D:\STAFF.TXT OF DEL MODIFIED BY DUMPFILE=d:\dump INSERT INTO STAFF1 FOR EXCEPTION STAFFEXP
(RUag%e.[-k7^'p0
Q})?2A ["`P#b0装入的结果报告中会有如下一条:
H _/l6JPFP0SQL3118W  在行 "32" 列 "1" 中的字段值不能转换为 SMALLINT 值,但是目标列不可为空。未装入该行。ITPUB个人空间w Q g F{
SQL3185W  当处理输入文件的第 "32" 行中的数据时发生先前的错误。
1K9|GkXM0
5_iy&qu#{/`0打开D盘的dump.000文件,会看到造成异常的那一行数据:"abcf","aaa","sdfg"
d+Ly5UILz2C0
9]"lV+G^$k0通过这个例子,我们可以理解,如果一行数据的格式不正确,在装入的时候会遭到拒绝,该行记录会放到DUMP文件中;而如果数据格式正确,但是不满足表的约束条件,该行记录会放到异常表中。
7du J T qX]0
aF YD)Mu+H5b0
-k[~E.U0ITPUB个人空间5U Y#b$C/qP6pO
例十五:限制装入行数ITPUB个人空间4{7Y}d$T ~*x*h c
用ROWCOUNT选项可以指定从文件开始处装入的记录数ITPUB个人空间aE-N1f~zk
LOAD FROM D:\STAFF.TXT OF DEL ROWCOUNT 3 INSERT INTO STAFF1ITPUB个人空间H~X P'}X3\g
ITPUB个人空间0~0ZGx8q;GD
ITPUB个人空间[.@5Ex"Q X0E'ly2h

9g*B:O3T.z[0例十六:出现警告信息时强令装入操作失败ITPUB个人空间[8e_g/s`|+g
在某些情况下,文件中的数据必须全部成功输入到目标表中才算成功,即使有一条记录出错也不行。在这种情况下,可以使用WARNINGCOUNT选项。ITPUB个人空间0qt2`,Nt8o f g$Eh
ITPUB个人空间3hp9o!d$J!u
到D盘上打开STAFF.TXT文件,把第一列等于320的行替换为:"abcf","aaa","sdfg"
yx/NIZ8r8w2^0
ljdExc4d0LOAD FROM D:\STAFF.TXT OF DEL WARNINGCOUNT 1 INSERT INTO STAFF1
f#Ep\FRf}0
%y2pj.Fj"SE'}0运行结果包含下面的警告:ITPUB个人空间#J&^ lwaQY G1N
SQL3118W  在行 "32" 列 "1" 中的字段值不能转换为 SMALLINT值,但是目标列不可为空。未装入该行。ITPUB个人空间 WP3P$`Jla5t
SQL3185W  当处理输入文件的第 "32" 行中的数据时发生先前的错误。
5V OY FnUHryDR0SQL3502N  实用程序遇到了 "1" 个警告,它超过了允许的最大警告数。ITPUB个人空间5R1G3F)`J-\+I,e

)g(dHC"zL2T}!G0此时无法对表STAFF1进行操作,例如
)g1X/W4U;Y6y;CQ0SELECT * FROM STAFF1
&}JB&mv%^D]j~0会返回:ITPUB个人空间b\a)Q(y?? eo
ID     NAME      DEPT   JOB   YEARS  SALARY    COMMITPUB个人空间 l9^`5c?;N%H;Y!|x4~
------ --------- ------ ----- ------ --------- ---------
p,d bt"cGB0SQL0668N  由于表 "USER.STAFF1" 上的原因代码 "3",所以不允许操作。
C~&l iRQ&C0SQLSTATE=57016
Jg?:]1V~"ZR4U(w1y0
"Ow-vk(I wf zL7O0原因是:表处于“装入挂起”状态。对此表的先前的 LOAD 尝试失败。在重新启动或终止 LOAD 操作之前不允许对表进行存取。ITPUB个人空间:Kxi-Q%?R

g)jE9d(II0解决方法为:通过分别发出带有 RESTART 或 TERMINATER 选项的 LOAD 来重新启动或终止先前失败的对此表的 LOAD 操作。ITPUB个人空间[U wD.i9h])z;S?
ITPUB个人空间S0o+kn"e&_j
包含TERMINATER的LOAD命令可以终止装入进程,使目标表恢复正常可用状态:ITPUB个人空间 x/T/M \/` LB8L
LOAD FROM D:\STAFF.TXT OF DEL TERMINATE INTO STAFF1ITPUB个人空间 @6vq&lR\
ITPUB个人空间_:dB z/h f:lg
包含RESTART的LOAD命令可以在源文件修改正确的时候使用,使装入进程重新开始:ITPUB个人空间_#WT-UFYD*v
LOAD FROM D:\STAFF.TXT OF DEL RESTART INTO STAFF1ITPUB个人空间_:l4W&{d6L+{ `I0tx
ITPUB个人空间9y I%Fq$x0Z'[u

-F/{1}`:|$o1Wz0ITPUB个人空间uH"Cya5u i"b'{f
例十七:防止产生警告信息ITPUB个人空间.r.xQ7Ud_;_
使用NOROWWARNINGS文件类型修饰符可以禁止产生警告信息,当装入过程可能出现大量警告信息,而用户对此又不感兴趣的时候,可以使用该选项,这样可以大大提高装入的效率
c,w!v [7N ~ W0
#f7]&X6d(fw)i%{7B0到D盘上打开STAFF.TXT文件,把第一列等于320的行替换为:"abcf","aaa","sdfg"ITPUB个人空间'k},c m;M;_5~}V-|

/?RsX0]}-FcE0LOAD FROM D:\STAFF.TXT OF DEL MODIFIED BY NOROWWARNINGS INSERT INTO STAFF1
5S5v;`8O-})B FI]}%O0ITPUB个人空间)G-^0la(yBmH0i1E
运行完的结果中,第32行出错,该行无法装入,但是不产生警告信息。ITPUB个人空间 U&G5`rTF'v @)W
ITPUB个人空间oU kY0w V1fe5U

C,qG(sF0ITPUB个人空间K }c_hG}l
例十八:生成统计数据
\ A,I3E%q9Yg"aT0使用STATISTICS选项可以在装入的过程中生成统计数据,这些统计数据可以供优化器确定最有效的执行SQL语句的方式。
D'P$ao6n#D0可以对表和索引产生不同详细程度的统计数据:ITPUB个人空间 I1Z0gZ B0T6i
ITPUB个人空间 E)[ Nj/y F
① 对表和索引产生最详细的统计数据:ITPUB个人空间$wE @"y{@OMxD*H cA
LOAD FROM D:\STAFF.TXT OF DEL REPLACE INTO STAFF1 STATISTICS YES WITH DISTRIBUTION AND DETAILED INDEXES ALL
*c3gI!ub0
VKbY SN0② 对表和索引都产生简略的统计:ITPUB个人空间olJ {X'e
LOAD FROM D:\STAFF.TXT OF DEL REPLACE INTO STAFF1 STATISTICS YES AND INDEXES ALLITPUB个人空间2sz a&Z]s
ITPUB个人空间ZyO.XC
其它组合可以参考DB2文档。
3R+Jp#B7o7Hu;K)cE0ITPUB个人空间Z-?a9C2UAS
注意:STATISTICS选项只能和REPLACE兼容,与INSERT选项不兼容。
!ax:W:C,A0X&`0
5D*AZ T5` H&w2C3F0另外,通过STATISTICS选项做完统计,我们看不到任何直接的结果,如果想查看其结果,需要到系统表中自己查询。ITPUB个人空间lzxx8}0y
ITPUB个人空间-p"bG/m5zQ

fO ~:kSi5VE)Oe,O0ITPUB个人空间h2E7|Ja
例十九:解除检查挂起状态ITPUB个人空间6JH}`j)U7kZts
1. 连接到SAMPLE数据库上:ITPUB个人空间.i{+F\+v4Q
Connect to sampleITPUB个人空间P,^jrou5_H-HW7B!H

%g\!E6^ w I?)d G^AU02. 创建一个结构与staff表相同的表:ITPUB个人空间#`'z'f2mj y!W+d-E3y
CREATE TABLE STAFF1 LIKE STAFFITPUB个人空间 \1oM;\"OI:`#Qx]

] m5k}[6Z03. 给该表添加一个检查约束:ITPUB个人空间|'IP:[]2o'fS8B*a
alter table staff1 add constraint chk check(dept<100)ITPUB个人空间 u;b X+c0]N

HN7M#U(XG04. 到D盘上打开STAFF.TXT文件,把最后一行数据的第三列改为150,这样该条数据就不满足第3步加上的检查约
h:F }B+r9x0ITPUB个人空间4ou#cGS]^4~4Uga
束条件了,然后用Load命令从文件中装入数据到staff1表中:
!JI|)s\`0LOAD FROM D:\STAFF.TXT OF DEL INSERT INTO STAFF1ITPUB个人空间!D u'N6_[K0^'x
ITPUB个人空间HDRS*i2V5BF
5. 此时运行查询命令:ITPUB个人空间/K1E4]4H2GS pn8|-z
Select * from staff1
-Q8T6G/s8L8Ck,\0会得到错误信息:ITPUB个人空间 Hb{s+L?(x
SQL0668N  由于表 "USER.STAFF1" 上的原因代码 "1",所以不允许操作。ITPUB个人空间$b$zTl g@#}
SQLSTATE=57016
{ |a4\S@0原因是装入时有数据违反了检查约束,造成表处于检查挂起状态。
4Gv6^9P5l0ITPUB个人空间{y$z^$WC/Id
6. 解除表的检查挂起状态,使用:
2Je3| }5B+WV0set integrity for staff1 check immediate uncheckedITPUB个人空间G5tf.UY
再次运行查询命令:ITPUB个人空间5r KPf%C%C2J
Select * from staff1
Bk rg P@~0发现表可以正常使用了,其中的违反检查规则的数据也存在。ITPUB个人空间?| l8e-qe
ITPUB个人空间P~ L+W0y5l?
ITPUB个人空间'rvTB-rLiZ,Q

:bK%@K0`~P0例二十:性能因素ITPUB个人空间d,Jsd^
在从文件向表导入数据的时候,当数据量特别大的情况下,装入命令会明显体现出优势,原因是它不像导入命令每次插入一行,并且在每行都要检查是否满足约束条件,装入命令从输入文件读出数据构建页,把这些页直接写入数据库,并且在每一行数据装入时不判断是否满足约束,另外装入命令不写日志,所有这些因素都导致装入的效率高于导入。
Gh,R5DQ0ITPUB个人空间S.S*s,e3E*m5Ul*] C
另外,装入命令还有一些选项可以控制性能因素:ITPUB个人空间5s8I _-P~
1. COPY YES/NO和NonrecoverableITPUB个人空间9^Q0A!UE$MI
① Nonrecoverable(不可恢复的):指定装入操作不可恢复,并且不能由后续的前滚操作恢复。前滚操作忽略事务并且标记正在装入数据的表为“无效”。
^AC7ww(PF0
a S S c/fo%jW ~7`;I0② Copy No(默认选项):在这种情况下,如果表所在数据库的归档日志处于启用状态,则装入完成后,表所在的表空间将处于备份挂起状态,直到数据库或表空间备份完毕,该表空间才成为可写表空间。原因是装入操作造成的变化没有被记录,所以要恢复装入操作完成后发生的故障,备份数据库或表空间是必要的。
p#Ac cW-tm x _m0
CS _ts0③ Copy Yes:在这种情况下,如果数据库的归档日志启用,装入操作的改变将被保存到磁带、目录或TSM服务器,并且表空间将不再处于备份挂起状态。ITPUB个人空间o%r(\Y*^ x9O
ITPUB个人空间2uee1M)J
2. Fastparse
"Y&^:om,T}0该文件类型修饰符用于减少数据检查次数。它只能用于在数据已知正确的情况下,尤其适用于DEL和ASC类型的文件。
yJVN6CO0ITPUB个人空间jeT%qt
3. Anyorder
x0E~gn"h.QEN z%e0J0如果SAVECOUNT选项没有使用,该参数允许不遵照输入文件中的数据顺序进行装入,在SMP(对称多处理机)系统上CPU_PARALLELISM选项大于1的时候,该参数会提高装入的性能。ITPUB个人空间e4t._0H2Oe?8X

M/|T*F;SA04. Data Buffer
]F7~L*A]0该参数用于指定从堆栈分配得到的4K大小的内存页面的数目,作为装入的内部缓冲区,指定一个大缓冲区有助于提高装入的性能。
r(Kg#{j8c ?.p Dk0
p |x+|_2|,YJ05. CPU_PARALLELISMITPUB个人空间W/Yhf%P0[2@
该选项只能用于SMP系统上,可以指示使用多少进程或线程解析、转换、格式化数据。
5CS(e+G c0s1R1T0
Ds2wW.V6H-[MCZ06. Disk_Parallelism
L*[:Dv@z p0该选项指定写数据到磁盘的进程或线程的数目。

TAG:

引用 删除 yeang   /   2008-06-25 10:11:23
bucuo
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-07-07  
  12345
6789101112
13141516171819
20212223242526
2728293031  

数据统计

  • 访问量: 4001
  • 日志数: 259
  • 文件数: 2
  • 建立时间: 2007-12-01
  • 更新时间: 2008-07-03

RSS订阅

Open Toolbar