导读:如现在有一张员工信息的表(USER_INFO)表。在这张表中有三个字段,分别为员工编号、员工姓名、员工身份证复印件等等。由于员工身份证复印件其容量比较大,为此数据库中采用的是LOB数据类型。当需要将这张表格中的数据导出到特定文件中的时候,只要这些身份证复印件的容量超过32KB的话,则在导出的目标文件中是看不到这些身份证复印件的。在导出的时候,系统会将这些身份证复印件保存在用户指定的文件夹内。而在导出地目标文件中,只有这些复印件对应的名字而已。所以说,如果一个表中有LOB数据类型,在导出到特定格式的文件中时,就需要区别对待。
如果某张表带有LOB类型的数据,此时在书写导出语句的时候,就需要特别的注意。如需要按如下的格式来书写导出LOB数据的语句:
class='fit-image' onload='javascript:if(this.width>498)this.width=498;' onmousewheel = 'javascript:return big(this)' height="108" alt="" src="http://images.51cto.com/files/uploadimg/20110411/1708130.jpg" width="495" border="0" />
导出LOB数据表与普通表相比的一些特殊选项。
跟普通的导出语句相比,在导出带有LOB数据类型的数据时,在语句中多了Lob to d:\photo1,d:\photo2 Lobfile p1,p2 modifiled by lobsinfile这么一条语句。其中选项LOB TO定义的是LOB文件要存储的路径。在定义这个路径的时候,用户可以定义多个目录。即可以指定一个使用逗号分隔符的目录列表来定义其文件存储的位置。如果没有定义目录的话,则数据库会采用当前目录作为这个LOB文件存储的位置。跟普通的操作系统目录一样,不同目录中的LOB文件名字可以不同。但是同一目录中的LOB文件名字必须唯一。第二个需要指定的是LOB文件的命名规则。由于在导出数据的时候,会产生很多的LOB文件。而这些数据库自动创建的文件必须要具有文件的名字。此时数据库管理员必须要指定这些LOB文件的命名规则。这个命名规则主要是利用可选项LOBFILE来确定。通过这个可选项,数据库管理员可以提高一个使用逗号分隔的基本名称列表。操作系统就会根据这些名字来生成LOB文件的名字。需要注意的是,此时数据库管理员提供的只是一个基本的名称,或者说只是LOB文件名的前缀。系统在生成LOB文件的时候,会自动在这个基本名称(或者叫做前缀)的后面加上3位数字的扩展。如上面笔者提供了p1作为LOB文件名的扩展,那么其最后生成的文件名就可能使p1001、p1002等等。可见系统管理员提供一个文件前缀名,系统就会自动扩展出999个可用的LOB文件名。因为操作系统会在LOB文件前缀后面加上3位阿拉伯数字的扩展名。这个选项跟目录选项一样是可选的。如果用户没有指定可用的文件基本名称,则DB2数据库会以db2exp作为基本的文件扩展名。然后在这个名字后面采用3位数字的扩展名,生成1000个可用的LOB文件的文件名字。
最后需要注意的是,如果在将某个表导出到特定文件的时候,想要分离文件导出LOB的时候,即将LOB文件与其他信息分开存放,还需要在导出语句中加入一个特殊的关键字。二、确定可用的文件名。
在将LOB数据类型导出的时候,数据库系统会在用户指定的目录中创建文件用来保存这些LOB数据类型。在数据库中一个LOB数据段就需要创建一个文件。也就是说,如果表中有2个字段采用的是LOB数据类型,而这个表有2万条记录的话,那么在导出的时候就会创建4万个文件。而一个文件对应一个文件名字,所以数据库管理员必须要保证有4万个可用的文件名字(注意不是文件基本名字)。如果在导出的时候,LOB数据类型太多,现有可用的文件名字不够使用的话,那么导出作业就会以失败告终。
为此在导出数据之前,数据库管理员需要评估一下数据表中LOB数据段的数量。然后根据这个数量来确定到底需要有多少个可用的文件名字。然后根据这个数量来确定存储的目录与文件基本名称的数量。如上面这个例子所示,最终的可用文件名字有多少呢?
首先数据库管理员需要知道的,一个基本名称可以通过三个阿拉伯数字扩展,得到1000个文件名字。然后同一个文件名字可以在不同的目录中使用。也就是说,上面指定的目录中,目录不同,文件名可以不同。只要保证同一个文件夹内部要有重名的文件即可。那么,两个文件基本名称,两个目录,再加上文件名字扩展的话,可以得到4000个可用的文件名字。这里有一个简单的计算公式,就是文件基本名称的数量*定义目录的数量*1000,最后得到的结果就是可用的文件名字数量。如果最后生成的LOB文件的数量小于这个文件可用数量的话,那么就可以正常导出。但是如果表中包含的LOB文件数量超过了这个可用的文件名数量,即使超过了一个,也会因为目的LOB文件得不到可用的文件名字而导致导出失败。当失败的时候,很难查询到底是哪个LOB文件没有导出。为此在导出之前,最好能够预计到可能需要的文件名字数量。其实这个预算也是比较简单的。至需要知道需要导出的表中有多少列是LOB数据类型的,然后再乘以记录数即可。一般情况下,文件的可用数量只可以比实际的LOB文件多,而不能够比起少。多了不会出文件,但是如果少了的话,则会导致数据导出失败。
有时候为了避免这个问题的出现,数据库管理员不得不增加LOB文件的目标目录,或者增加LOB基本文件名的数量,使得导出能够为所有包含在SELECT语句的结果集合中的LOB数据生成足够多的文件名字。这里需要注意的是,数据库管理员不可以增加扩展的位数。即文件名扩展只可以用到3位阿拉伯数字。另外需要注意的是,由于LOB数据类型的数据都比较大,将他们导出到特定文件中的时候,往往需要花费比较长的时间。为此笔者并不建议一下子就将导出LOB数据类型导出来。在Select语句中加入适当的限制条件,可以分批导出LOB文件,以减少每次导出的时间。如导出所有员工的身份证复印件时,可以按性别分为两类或者按部分来进行分类。这有两个好处。一是可以缩短每次导出的时间,即使中间遇到问题也可以控制在最小的范围之内。二是导出的LOB文件名是随机的。为此分批导出的话,在寻找对应LOB文件的时候,会方便许多。
上文中就正确导出LOB数据给出了详细的解析,希望对打击能够有所帮助。