我们以假设的方式来对DB2表格操作技巧导出LOB数据进行描述,假设现在有一张员工信息的表(User_INFO)表。表中一共有三个字段,即员工编号、员工姓名、以及员工身份证复印件等等。由于员工身份证复印件其容量比较大,为此数据库中采用的是LOB数据类型。
如现在有一张员工信息的表(USER_INFO)表。在这张表中有三个字段,分别为员工编号、员工姓名、员工身份证复印件等等。由于员工身份证复印件其容量比较大,为此数据库中采用的是LOB数据类型。
当需要将这张DB2表格中的数据导出到特定文件中的时候,只要这些身份证复印件的容量超过32KB的话,则在导出的目标文件中是看不到这些身份证复印件的。在导出的时候,系统会将这些身份证复印件保存在用户指定的文件夹内。而在导出地目标文件中,只有这些复印件对应的名字而已。所以说,如果一个表中有LOB数据类型,在导出到特定格式的文件中时,就需要区别对待。
如果某张表带有LOB类型的数据,此时在书写导出语句的时候,就需要特别的注意。如需要按如下的格式来书写导出LOB数据的语句:
导出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文件的文件名字。
最后需要注意的是,如果在将某个DB2表格表导出到特定文件的时候,想要分离文件导出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文件的时候,会方便许多。以上的相关内容就是对DB2表格操作技巧——正确导出LOB数据的介绍,望你能有所收获。
【编辑推荐】
谁能告诉我DB2如何备份与恢复?详细点,我能看的
不知道怎样才算是你能看懂的,我前些日子记录的一些db2数据库的一些命令,很少,不过有用。用你的话说:我能看懂的,太专业了,直接去找API好了,希望这些对你有些帮助:1.0 关闭db2 db2stop 或 db2stop force2.0 启动db2 db2start3.0 创建数据库 db2 create db 4.0 删除数据库 db2 drop db 执行此操作要小心,如果不能删除,断开所有的数据库连接或重启db2 5.0 断开数据库连接 db2 force application all 6.0 连接数据库 连接本地数据库 db2 connect to 7.0 连接远程数据库 db2 connect to user using 8.0 断开数据库连接 db2 connect reset 或者 db2 disconect current 9.0 断开所有数据库的连接 db2 disconnect all 10.0 备份数据库 db2 backup db 备注:执行以上命令之前需要断开数据库连接 11.0 恢复数据库 db2 restore db 12.0 导出数据文件 db2move export [-sn ] [-tn ] 13.0 导入数据文件 db2move import 14.0 列出数据库中所有的db db2 list db directory 15.0 进入db2命令环境 在运行中执行:db2cmd
[数据库类]readdir后要把该文件夹所有的图片insert进数据库要怎么做 - PHP进阶讨论
刚刚看PDO看到的前提是要使用pdo~~Inserting an image into a databaseThis example opens up a file and passes the file handle to PDO to insert it as a LOB. PDO will do its best to get the contents of the file up to the database in the most efficient manner possible. [ol][*]prepare(\insert into images (id, contenttype, imagedata) values (?, ?, ?)\);[*]$id = get_new_id(); // some function to allocate a new ID[*][*]// assume that we are running as part of a file upload form[*]// You can find more information in the PHP documentation[*][*]$fp = fopen($_FILES[\file\][\tmp_name\], \rb\);[*][*]$stmt->bindParam(1, $id);[*]$stmt->bindParam(2, $_FILES[\file\][\type\]);[*]$stmt->bindParam(3, $fp, PDO_PARAM_LOB);[*][*]$stmt->execute();[*]?>??[/ol]
Sql数据库和ACCESS数据库使用区别

ACCESS改为SQL需要注意哪几个地方 数据库导入以后,自动增加字段需要重写,所有的数字类型需要增加长度,最好用decimal。 所有的默认值都丢失了。 主要是数字类型和日期类型。 所有now(),time(),date()要改成getdate()。 所有datediff(‘d‘, time1, time2)要改成datediff(day, time1, time2) 有可能一些true/false类型不能使用,要变为1/0。 备注类型要通过cast(column as varchar)来使用。 CursorType要改成1,也就是打开数据库时要给出第一个数字参数为1,否则记录可能显示不完整。 isnull(rowname)要改成rowname = null ACCESS的数据库中的自动编号类型在转化时,sql server并没有将它设为自动编号型,我们需在SQL创建语句中加上identity,表示自动编号! 转化时,跟日期有关的字段,SQL SERVER默认为smalldatetime型,我们最好将它变为datetime型,因为datetime型的范围比smalldatetime型大。 有时用smalldatetime型时,转化失败,而用datetime型时,转化成功。 对此两种数据库进行操作的sql语句不全相同,例如:在对ACCESS数据库进行删除纪录时用:“delete * from user where id=10“,而对SQL SERVER数据库进行删除是用:“delete user where id=10“. 日期函数不相同,在对ACCESS数据库处理中,可用date()、time()等函数,但对SQL SERVER数据库处理中,只能用datediff,dateadd等函数,而不能用date()、time()等函数。 在对ACCESS数据库处理中,sql语句中直接可以用一些VB的函数,像cstr()函数,而对SQL SERVER数据库处理中,却不能用。 ACCESS转SQL SERVER的数据库的几点经验 的数据库中的自动编号类型在转化时,sql server并没有将它设为自动编号型,我们需在SQL创建语句中加上identity,表示自动编号! 2.转化时,跟日期有关的字段,SQL SERVER默认为smalldatetime型,我们最好将它变为datetime型,因为datetime型的范围比smalldatetime型大。 我遇见这种情况,用smalldatetime型时,转化失败,而用datetime型时,转化成功。 3.对此两种数据库进行操作的sql语句不全相同,例如:在对ACCESS数据库进行删除纪录时用:“delete * from user where id=10“,而对SQL SERVER数据库进行删除是用:“delete user where id=10“. 4.日期函数不相同,在对ACCESS数据库处理中,可用date()、time()等函数,但对SQL SERVER数据库处理中,只能用datediff,dateadd等函数,而不能用date()、time()等函数。 5.在对ACCESS数据库处理中,sql语句中直接可以用一些VB的函数,像cstr()函数,而对SQL SERVER数据库处理中,却不能用。
发表评论