15.8 数据移动常见问题总结

15.8 数据移动常见问题总结
时间:2009-11-22 21:37 来源:未知 作者:admin
http://ajava.org/readbook/db/xxjjdb2/17226.html
核心提示:15.8 数据移动常见问题总结 如果我们只是在同一个数据库中进行数据移动,那么这将是非常简单的事情。但是实际生活中我们的数据源可能来自异构数据库,平台、操作系统也不同,数据移动过程中会涉及到代码页转换问题、标识列、生成列、大对象、XML、日期格式、

15.8 数据移动常见问题总结

如果我们只是在同一个数据库中进行数据移动,那么这将是非常简单的事情。但是实际生活中我们的数据源可能来自异构数据库,平台、操作系统也不同,数据移动过程中会涉及到代码页转换问题、标识列、生成列、大对象、XML、日期格式、空值处理、定界符和PC/IXF格式问题。本节我们主要讲解这些内容。

15.8.1 标识列

当表中有标识列时,由于标识列由数据库自动维护,所以导入导出时需要特别注意。

1. 标识列导出注意事项

可使用EXPORT实用程序从包含标识列的表中导出数据。但是,标识列会限制您输出文件格式的选择。

如果对导出操作指定的SELECT语句的格式为SELECT * FROM tablename并且未使用METHOD选项,那么支持将标识列属性导出至IXF文件。然后可使用IMPORT命令的REPLACE_CREATE和CREATE选项重新创建该表,包括其标识列属性。如果通过包含GENERATED ALWAYS类型标识列的表创建已导出IXF文件,那么成功导入数据文件的唯一方法就是在导入操作期间指定identityignore文件类型修饰符,否则会拒绝所有行(发出 SQL3550W)。

2. 标识列导入(IMPORT)和装入(LOAD)注意事项

无论输入数据是否具有标识列值,都可以使用IMPORT/LOAD实用程序将数据导入/装入到包含标识列的表中。

如果未使用与标识相关的文件类型修饰符,那么该实用程序会遵循下列规则来工作:

● 如果标识列是GENERATED ALWAYS列,那么每当输入文件中的相应行缺少标识列值,或者显式指定了NULL值时,会为表行生成标识值。如果对标识列指定了非空值,那么会拒绝该行(SQL3550W)。

● 如果标识列是GENERATED BY DEFAULT列,那么IMPORT/LOAD实用程序会使用用户提供的值(如果提供了这些值);如果缺少数据或者显式指定了NULL,那么会生成值。

除了通常对标识列数据类型(即SMALLINT、INT、BIGINT或DECIMAL)的值执行的验证操作以外,IMPORT/LOAD实用程序不会对用户提供的标识值执行任何其他的验证操作。不报告重复值。此外,在将数据导入(import)到带有标识列的表中时,不能使用compound=x修饰符。

有3种文件类型修饰符可用来简化将数据导入到包含标识列的表中的操作:identitymissing、identityignore和identityoverride,如表15-1所示。

表15-1 用来简化将数据导入到包含标识列的表中的3个文件类型修饰符

文件修饰符

支持IMPORT

支持LOAD

描 述

identityignore

yes

yes

指定忽略导入或载入输入文件中的任何标识列的值,并为每一行生成一个新的标识值

identitymissing

yes

yes

指定导入或载入输入文件不包含任何目标表中标识列 的值

identityoverride

no

yes

指定在将数据载入一个带有GENERATED ALWAYS标识列的表中时,要使用的载入输入文件中标识列的值;任何标识列上值为空(或为NULL值)的行都会被拒绝

通过表15-1我们可以看到,IMPORTLOAD都支持identitymissing和identityignore文件类型修饰符,但是LOAD支持identityoverride文件修饰符而IMPORT不支持。解了上述文件类型修饰符以后,下面我们举一些例子。

15-1 在没有标识列的情况下导入数据。

如果输入数据文件未包含任何标识列值(甚至未包含NULL值),那么identitymissing文件类型修饰符可以使您更方便地导入带有标识列的表。例如,考虑使用以下SQL语句定义的表:

create table table1 ( c1 char(30),

c2 int generated by default as identity,

c3 real,

c4 char(1))

用户可能想要将数据从文件(import.del)导入到TABLE1中,并且此数据可能是从没有标识列的表中导出的。下面是此类文件的一个示例:

Robert, 45.2, J

Mike, 76.9, K

Leo, 23.4, I

导入此文件的一种方法是通过 IMPORT命令显式列示所要导入的列,如下所示:

db2 import from import.del of del replace into table1 (c1, c3, c4)

但是,对于包含许多列的表来说,此语法难以使用并且容易出错。导入该文件的另一种方法是使用identitymissing文件类型修饰符,如下所示:

db2 import from import.del of del modified by identitymissing replace into table1

15-2 在带有标识列的情况下装入数据。

identityignore文件类型修饰符在某些方面与identitymissing相反。它指示LOAD实用程序:即使输入数据文件包含标识列数据,也应该忽略该数据,并且应该为每一行生成标识值。例如,用户可能想将以下数据按照例15-1中所示定义从文件(load.del)导入到TABLE1中:

Robert, 1, 45.2, J

Mike, 2, 76.9, K

Leo, 3, 23.4, I

如果用户提供的值1、2和3 未用于标识列,那么该用户可以发出以下LOAD命令:

db2 load from import.del of del method P(1, 3, 4) replace into table1 (c1, c3, c4)

同样,如果该表包含许多列,那么此方法可能难以使用并且容易出错。identityignore文件类型修饰符可以将语法简化为:

db2 load from import.del of del modified by identityignore replace into table1

当带有标识列的表导出至IXF文件时,可使用IMPORT命令的REPLACE_CREATE和CREATE选项来重新创建该表,包括其标识列属性。如果这种IXF文件是从包含类型为GENERATED ALWAYS的标识列的表创建的,那么只有通过指定identityignore文件类型修饰符才能成功导入数据文件,否则会拒绝所有行(SQL3550W)。

15-3 入包含用户提供的值的数据(identityoverride)。

这个文件类型修饰符IMPORT不支持,identityoverride文件类型修饰符用来将用户提供的值装入到包含GENERATED ALWAYS标识列的表中。当从另一数据库系统迁移数据并且必须将表定义为GENERATED ALWAYS时,或者在将使用ROLLFORWARD DATABASE命令DROPPED TABLE RECOVERY选项恢复的数据装入到表中时,此文件类型修饰符非常有用。当使用了此文件类型修饰符时,将拒绝任何未包含标识列数据(或者包含NULL数据)的行(SQL3116W)。还应该注意,使用此文件类型修饰符时,可能会违反GENERATED ALWAYS列的唯一性属性。在这种情况下,执行LOAD TERMINATE操作,然后接着执行LOAD INSERT或REPLACE操作。下面我们举个例子。

考虑载入输入文件custdata.del,它的内容为“3,"Shrek"”:

create table customers (custno smallint not null generated always as identity (start with 500, increment by 1), custname varchar(16)); ---该表具有标识列,开始值是500,而我们导入的值是3。

load from custdata.del of del modified by identityoverride messages load.msg insert into customers;

select * from customers; ---我们可以看到由于我们指明了identityoverride,所以我们提供的值3覆盖了500。

3. LOAD标识列注意事项

在大多数情况下,LOAD实用程序无法保证对各行指定标识列值的顺序与这些行在数据文件中的出现顺序相同。由于LOAD实用程序以并行方式对标识列值的指定进行管理,所以这些值按任意顺序指定。它的例外情况如下所示:

● 在单一分区数据库中,当CPU_PARALLELISM设置为1时,不以并行方式处理行。在此情况下,将按照各行在数据文件参数中的出现顺序来隐式地指定标识列值。

● 在多分区数据库中,如果标识列位于分布键中且存在单分区代理程序(即,未指定多个分区代理程序或anyorder文件类型修饰符),那么将按照各行在数据文件中的出现顺序来指定标识列值。

将表装入到分区数据库中时,如果该表在数据库的分区键中具有标识列并且未指定 identityoverride文件类型修饰符,那么不能指定SAVECOUNT选项。当分区键中存在标识列并且正在生成标识值时,在至少一个数据库分区上从装入阶段重新启动装入操作时,需要从装入阶段开始时就重新启动整个装入操作,这意味着不可能有任何一致点。

注意:

如果符合下列所有条件,那么不允许执行LOAD RESTART操作,应改为发出LOAD TERMINATE或REPLACE操作。

● 要装入的表位于分区数据库环境中,并且它包含至少一个标识列,该标识列位于分区键中或由分区键中的生成列引用。

● 未指定identityoverride文件类型修饰符。

● 失败的上一个装入操作包括装入在装入阶段后失败的数据库分区。

15.8.2 生成列

当表中有生成列时(生成列是由数据库自动维护的),对于导出没有特别注意的,但是导入时需要特别注意。

1. 生成列IMPORT/LOAD注意事项

无论输入数据是否具有生成列值,都可以将数据装入到包含(非标识)生成列的表中。IMPORT/LOAD实用程序生成列值。

如果未使用任何与生成列相关的文件类型修饰符,IMPORT/LOAD实用程序就会依照下列规则工作:

● 当数据文件中相应的行缺少生成列的值或提供了NULL值时,将创建生成列值。如果为生成列提供了非空值,那么将拒绝该行(SQL3550W)。

● 如果为不可空生成列创建了NULL值,那么将拒绝整行数据(SQL0407N)。例如,如果将不可空生成列定义为两个表列之和,但这两个表列在数据文件中包含 NULL值,那么就会发生这种情况。

表有3种相互排斥的方法可用来简化将数据装入到包含生成列的表中的操作:generated missing、generatedignore和generatedoverride文件类型修饰符,如表15-2所示。

表15-2 简化将数据装入到包含生成列的表中的方法

文件修饰符

支持IMPORT

支持LOAD

描 述

generatedignore

yes

Yes

指定导入或载入输入文件中的任何生成列的值都会被忽略,并且会为每一行生成一个新的值

generatedmissing

yes

Yes

指定导入或载入输入文件不包含任何目标表中生成列的值

generatedoverride

no

yes

指定在将数据载入一个带有GENERATED ALWAYS列的表中时,要使用的载入输入文件中生成列的值。如果您使用了该文件类型修饰符,您的表在执行载入操作之后,将处于检查暂挂状态,以便给您机会验证新数据的完整性。这里的完整性是指与生成列规范的一致性。如果要使表脱离该状态,且不验证输入值,那么就在执行载入操作之后发出下列命令:set integrity for < table-name> generated column immediate unchecked。如果要解除该表的检查暂挂状态,且验证输入值,那么就发出下列命令:set integrity for < table-name> immediate checked

通过表15-2我们可以看到,IMPORTLOAD都支持generatedmissing和generatedignore文件类型修饰符,但是LOAD支持generatedoverride文件修饰符而IMPORT不支持。了解了上述文件类型修饰符以后,下面我们举一些例子。

15-4 在没有生成列的情况下导入数据。

如果输入数据文件不包含表中的所有生成列的任何值(甚至未包含NULL值),那么 generatedmissing文件类型修饰符会使您能够更方便地将数据导入到包含生成列的表中。例如,考虑使用以下SQL语句定义的表:

create table table1 ( c1 int,

c2 int,

g1 int generated always as (c1 + c2),

g2 int generated always as (2 * c1),

c3 char(1))

用户可能想将数据从文件(load.del)导入到TABLE1中,此数据可能是从没有任何生成列的表中导出的。下面是此类文件的一个示例:

1, 5, J

2, 6, K

3, 7, I

导入此文件的一种方法是通过IMPORT或LOAD命令显式列示所要导入的列,如下所示:

db2 import/load from import.del of del replace into table1 (c1, c2, c3)

但是,对于包含许多列的表来说,此语法难以使用并且容易出错。另一种导入此文件的方法是使用generatedmissing文件类型修饰符,如下所示:

db2 import/load from import.del of del modified by generatedmissing replace into table1

15-5 在具有生成列的情况下导入数据。

Generatedignore文件类型修饰符在某些方面与 generatedmissing相反。它向IMPORT/LOAD实用程序指示:即使输入数据文件包含所有生成列的数据,也应该忽略该数据,并且应该为每一行生成值。例如,用户可能想将以下数据按照上述定义从文件(load.del)导入到TABLE1中:

1, 5, 10, 15, J

2, 6, 11, 16, K

3, 7, 12, 17, I

用户提供的非空值10、11和12(用于g1)以及15、16和17(用于g2)导致拒绝该行(SQL 3550W)。为了避免这种情况,用户可以发出以下IMPORT/LOAD命令:

db2 import/load from import.del of del method P(1, 2, 5) replace into table1 (c1, c2, c3)

同样,如果该表包含许多列,那么此方法可能难以使用并且容易出错。generatedignore 文件类型修饰符可以将语法简化为:

db2 import/load from import.del of del modified by generatedignore replace into table1

对于INSERT_UPDATE,如果生成列同时充当主键并且指定了generatedignore文件类型修饰符,那么IMPORT命令会采用generatedignore文件类型修饰符。IMPORT命令不会在UPDATE的WHERE子句中用用户提供的值替换此列。

15-6 装入包含用户提供的值的数据。

Generatedoverride文件类型修饰符只支持LOAD实用程序,它用来将用户提供的值装入到包含生成列的表中。当从另一个数据库系统迁移数据,或者在将使用ROLLFORWARD DATABASE命令 RECOVER DROPPED TABLE选项恢复的数据装入到表中时,此文件类型修饰符非常有用。当使用了此文件类型修饰符时,将拒绝任何未包含不可空生成列数据(或者包含NULL数据)的行(SQL3116W)。使用此文件类型修饰符时,装入操作完成后将使表处于“设置完整性暂挂”状态。要使该表脱离“设置完整性暂挂”状态,而不验证用户提供的值,请执行以下命令:

SET INTEGRITY FOR table-name GENERATED COLUMN IMMEDIATE UNCHECKED

要使该表脱离“设置完整性暂挂”状态并强制验证用户提供的值,请执行以下命令:

SET INTEGRITY FOR table-name IMMEDIATE CHECKED

下面我们举个例子,假如载入输入文件staffdata.del的内容为:“"Jack",500000.00,50000”:

create table newstaff (name varchar(16) not null, salary decimal(9,2), bonus decimal(9,2) generated always as (salary/10));

load from staffdata.del of del modified by generatedoverride messages load.msg insert into newstaff;

set integrity for newstaff immediate checked;

select * from newstaff;

如果生成列在任何分区、维或分布键中,那么会忽略generatedoverride文件类型修饰符并且LOAD实用程序会生成值,就像指定了generatedignore文件类型修饰符一样。这样做是为了避免用户提供的生成列值与它的生成列定义相冲突,在这种情况下,会将生成的记录放置在错误的物理位置,例如错误的数据分区、MDC块或数据库分区。

注意:

如果一个生成列表达式包含受防护的(FENCED)用户定义的函数,那么尝试装入到这样的表中时装入操作会失败。但是,通过使用generatedoverride文件类型修饰符,可以为这些类型的生成列提供您自己的值。

15.8.3 大对象

LOB导出注意事项

导出包含大对象(LOB)列的表时,默认操作是对每个LOB值导出最多32 KB,以便将其与列数据的余下部分放在同一文件中。如果要导出超过32 KB的LOB值,那么应将LOB数据写至单独的文件以避免截断。

要指定应将LOB写至自己的文件,请使用 lobsinfile文件类型修饰符。此文件类型修饰符指示EXPORT实用程序将LOB数据放在LOBS TO子句指定的目录中。使用LOBS TO或LOBFILE会隐式激活lobsinfile文件类型修饰符。默认情况下,LOB值与导出的关系数据将写至同一路径。如果使用LOBS TO选项指定了一个或多个路径,那么EXPORT实用程序将循环使用这些LOB路径,以便将每个成功的LOB值写入相应的LOB文件。还可使用 LOBFILE选项对输出 LOB文件指定名称。如果指定了LOBFILE选项,那么lobfilename的格式为lobfilespec.xxx.lob,其中 lobfilespec是为LOBFILE选项指定的值,而xxx是EXPORT实用程序生成的LOB文件的序号。否则,lobfilename的格式为:exportfilename.xxx.lob,其中exportfilename是为EXPORT命令指定的已导出输出文件的名称,而xxx是 EXPORT实用程序生成的LOB文件的序号。

默认情况下,多个LOB将写至单个文件,但您也可指定将各个LOB存储在不同文件中。EXPORT实用程序会生成LOB位置说明符(LLS),以允许将多个LOB存储在一个文件中。写至导出输出文件的 LLS是一个指示LOB数据在文件中存储位置的字符串。LLS的格式为lobfilename.ext.nnn.mmm/,其中 lobfilename.ext是包含LOB的文件的名称,nnn是该文件内LOB的偏移量(以字节为单位计量),而 mmm是LOB的长度(以字节为单位计量)。例如,db2exp.001.123.456/的LLS表示LOB位于文件db2exp.001中,以 123字节的偏移量开始进入文件,并且长度为456字节。如果LLS中指示的大小为0,那么LOB被视为长度是0。如果长度为–1,那么LOB被视为 NULL,并且忽略偏移量和文件名。

如果不希望个别LOB数据并置于同一文件,请使用lobsinsepfiles文件类型修饰符以将每个LOB写至单独文件。

大对象LOAD/IMPORT注意事项

因为IMPORT/LOAD实用程序将单个列的大小限制为32KB,所以导入LOB时有一些额外注意事项。

默认情况下,IMPORT /LOAD实用程序将输入文件中的数据视为要装入列中的数据。但是,如果大对象(LOB)数据存储在主要输入数据文件中,那么数据大小被限制为32KB。因此,为避免丢失数据,应将LOB数据存储在主要数据文件以外的位置,并且应在导入LOB时指定lobsinfile文件类型修饰符。

LOBS FROM子句会隐式激活lobsinfile。导入数据时,LOBS FROM子句会将导入数据时用于搜索 LOB文件的路径列表传递至 IMPORT/LOAD实用程序。如果未指定 LOBS FROM选项,那么假定要导入的LOB文件与输入关系数据文件位于同一路径中。

指示存储LOB数据的位置

导入LOB信息时,可以使用LOB位置说明符(LLS)将多个LOB存储在单个文件中。指定lobsinfile后,EXPORT实用程序会生成LLS并将其存储在导出输出文件中,并且 LLS 会指示LOB数据的位置。导入使用指定的lobsinfile选项修饰的数据时,数据库要求每个对应LOB列都有对应的LLS。如果LOB列遇到的不是LLS,那么数据库会将其视为LOB文件,并且将把整个文件作为LOB装入。

对于CREATE方式下的IMPORT,可通过使用LONG IN子句指定将创建LOB数据并将其存储在单独的表空间中。

以下示例显示如何导入LOB并将其存储在不同文件中的DEL文件:

IMPORT/LOAD FROM inputfile.del OF DEL LOBS FROM /tmp/data MODIFIED BY lobsinfile

INSERT INTO newtable

15.8.4 空值处理

在数据移动中,NULL值是最难处理的,表15-3所示的文件修饰符可以用于处理NULL值。

表15-3 用于处理NULL值的文件修饰符

文件修饰符

描 述

nullindchar= x

指定x的值(单个字符)将用于替换空值

striptnulls

当将一个数据装入到一个变长字段时,将截断任何尾部的NULL(0x00)字符,如果未指定此选项则会保留NULL

不能将此选项与striptblanks同时指定。它们是互斥的。此选项会取代过时的padwithzero选项

striptblanks

当将一个数据装入到一个变长字段时,将截断任何尾部的空格。如果未指定此选项则会保留空格

不能将此选项与striptnulls同时指定。它们是互斥的。此选项会取代过时的t选项

 

(续表)

文件修饰符

描 述

keepblanks

指定在执行导入或载入操作时,要保留CHAR、VARCHAR、LONG VARCHAR或CLOB等类型列中开头或结尾的空白字符(不包含在字符定界符之中)。如果您所定义的非空(NOT NULL)列包含一个或多个空白字符,且这些空白字符表示有效数据,那么该修饰符会极其有用。如果您在导入或载入这些数据时未指定keepblanks修饰符,实用工具将试图用一个空(NULL)值来替换空白字符,但因为该列是不可为空的,所以实用工具会返回一个错误。请注意,在载入CHAR列时,总是会在结尾的空白中填入该列长度。但是,keepblanks 修饰符对于保留CHAR列中开头的空白是有必要的

下面我们举一个使用这些文件修饰符的的例子。

例15-7 nullindchar文件修饰符使用示例。

对于IXF格式的文件来说,导入空值非常方便,因为里面已经记录了空值的信息。但是,对于ASC格式文件就有一定的难度了,因为DB2会直接插入空格,而不是空值。为此,DB2提供了一个文件修饰符进行控制—— NULL INDICATORS。

考虑导入数据文件null.txt的内容为—— test++++++++ N+++(+表示空格)。

C:\>db2 create table names (firstname varchar(12), lastname varchar(12))

DB20000I SQL命令成功完成。

C:\> db2 import from null.txt of asc modified by nullindchar=N method l (1 12,13 24) null indicators(0,13) insert into names

读取行数 = 1

跳过行数 = 0

插入行数 = 1

更新行数 = 0

拒绝行数 = 0

落实行数 = 1

C:\>db2 select * from names

FIRSTNAME LASTNAME

------------ ------------

test -

1条记录已选择。

上述IMPORT语句中表示13字符开始的列值为N的时候替换为空值。

striptnulls

考虑载入输入文件orgdata.asc的内容为:++++++10Head Office++++++++160Corporate+ New York+----。

db2 create table orgtemp like org

db2 load from orgdata.asc of asc modified by striptnulls method l (1 8, 9 22, 23 30, 31 40, 41 53) messages load.msg insert into orgtemp

读取行数 = 1

跳过行数 = 0

装入行数 = 1

拒绝行数 = 0

删除行数 = 0

落实行数 = 1

db2 select location concat division from orgtemp

1

-----------------------

New York Corporate

在上面的例子中,我们看到在使用了striptnulls之后,将输入文件尾部的null删除了。

keepblanks

db2 create table names (lastname char(16), firstname char(16))

DB20000I SQL命令成功完成。

db2 create table newnames like names

DB20000I SQL命令成功完成。

db2 insert into names values (' Tallerico ', ' Teresa ')

DB20000I SQL命令成功完成。

db2 export to names.del of del modified by nochardel messages export.msg select * from names

导出的行数:1

db2 load from names.del of del modified by keepblanks messages load.msg insert into newnames

读取行数 = 1

跳过行数 = 0

装入行数 = 1

拒绝行数 = 0

删除行数 = 0

落实行数 = 1

db2 select firstname concat lastname from newnames

1

--------------------------------

Teresa Tallerico

1条记录已选择。

在上述例子中,我们看到在使用了keepblanks之后,导入的数据中的空格都保留了下来。

striptblanks

考虑载入输入文件orgdata.asc的内容为:++++++10Head Office++++++++160Corporate+ New York+++++。

db2 create table orgtemp like org

DB20000I SQL命令成功完成。

db2 load from orgdata.asc of asc modified by striptblanks method l (1 8, 9 22, 23 30, 31 40, 41 53) messages load.msg insert into orgtemp

读取行数 = 1

跳过行数 = 0

装入行数 = 1

拒绝行数 = 0

删除行数 = 0

落实行数 = 1

db2 select location concat division from orgtemp

1

-----------------------

New YorkCorporate

在上述例子中,我们看到在使用了striptblanks之后,头部和尾部的所有空格都被删除了。

15.8.5 定界符注意问题

1. 定界符格式移动数据时的注意事项

移动定界ASCII(DEL)文件时,一定要确保移动的数据不会因为定界字符识别问题而导致无意中发生改变。为帮助避免发生这些错误,DB2会强制实施若干限制并提供了许多文件类型修饰符。有许多限制可帮助避免所选定界字符被视为移动数据的一部分。首先,定界符是互斥的。其次,定界符不能是二进制零、换行符、回车符或空格。而且默认小数点(.)不能是字符串定界符。最后,在DBCS环境中,不支持竖线(|)字符定界符。下面是一些定界符的使用限制:

● 空格(X'20')永远不能作为有效定界符。

● 在导入期间将删除第一个字符前面的空格或者单元格值中最后一个字符后面的空格。不会删除单元格值中间嵌入的空格。

● 由于句点(.)与时间戳记值中的句点冲突,所以它不是有效的字符串定界符。

● 对于纯DBCS(图形)、混合DBCS和EUC来说,定界符的范围是x00到x3F。

● 对于使用EBCDIC代码页指定的DEL数据来说,定界符可能与shift-in和shift-out DBCS字符不一致。

● 在Windows操作系统上,字符定界符外部第一次出现的文件结束符(X'1A')指示文件结束。不会导入任何后续数据。

● 空值表示通常应该赋值的单元格缺少单元格值,也可以表示一串空格。

● 由于某些产品将字符字段的长度限制为254或255个字节,所以,每当选择导出最大长度超过 254个字节的字符列时,EXPORT实用程序就会生成警告消息。IMPORT实用程序可以接受与最长的LONG VARCHAR和LONG VARGRAPHIC 列等长的字段。

● 如果服务器的代码页与客户机的代码页不同,那么建议指定非默认定界符的十六进制表示法。例如:

db2 load from ... modified by chardel0x0C coldelX1e ...

2. 数据移动期间的定界符问题

双字符定界符

默认情况下,对于DEL文件的基于字符的字段来说,字段中的任何字符定界符实例都用双字符定界符表示。例如,假定字符定界符是双引号,如果导出文本“I am 6" tall.”,那么DEL文件中的输出文本显示为“"I am 6"" tall."”相反,如果DEL文件中的输入文本为“"What a ""nice"" day!"”,那么导入的文本为“What a "nice" day!”。

nodoubledel

可通过指定nodoubledel文件类型修饰符对IMPORT、EXPORT和LOAD实用程序禁用双字符定界符行为。但要注意的是,双字符定界符行为是为了避免解析错误。对导出使用 nodoubledel时,字符定界符出现在字符字段中时不会显示为双字符。对导入和装入使用nodoubledel时,双字符定界符不会解释为字符定界符的字面值实例。

nochardel

对导出使用nochardel文件类型修饰符时,字符字段不会用字符定界符括起来。对导入和装入使用nochardel时,字符定界符不会被视作特殊字符并且会解释为实际数据。

db2 create table stafftemp like staff

DB20000I SQL命令成功完成。

db2 export to staffdata.del of del modified by nochardel messages export.msg select * from staff

导出的行数:35

db2 import from staffdata.del of del modified by nochardel messages import.msg insert into stafftemp

读取行数 = 35

跳过行数 = 0

插入行数 = 35

更新行数 = 0

拒绝行数 = 0

落实行数 = 35

上述脚本中staffdata.del文件的内容如下所示:

10,Sanders,20,Mgr ,7,+98357.50,

20,Pernal,20,Sales,8,+78171.25,+00612.45

30,Marenghi,38,Mgr ,5,+77506.75,

40,O'Brien,38,Sales,6,+78006.00,+00846.55

50,Hanes,15,Mgr ,10,+80659.80,

60,Quigley,38,Sales,,+66808.30,+00650.25

70,Rothman,15,Sales,7,+76502.83,+01152.00

如果不使用nochardel文件修饰符,那么导出的文件内容如下所示:

10,"Sanders",20,"Mgr ",7,+98357.50,

20,"Pernal",20,"Sales",8,+78171.25,+00612.45

30,"Marenghi",38,"Mgr ",5,+77506.75,

40,"O'Brien",38,"Sales",6,+78006.00,+00846.55

50,"Hanes",15,"Mgr ",10,+80659.80,

60,"Quigley",38,"Sales",,+66808.30,+00650.25

70,"Rothman",15,"Sales",7,+76502.83,+01152.00

chardel

可使用其他文件类型修饰符,以通过手动方式避免默认定界符与数据之间混淆。chardel文件类型修饰符将单字符x指定为要使用的字符串定界符,以替代默认情况下使用的双引号。

db2 export to orgdata.del of del modified by chardel'' messages export.msg select * from org

coldel x

同样,要避免将默认情况下使用的逗号用作列定界符,可使用coldel,它会将单字符x指定为列数据定界符。

db2 create table orgtemp like org

DB20000I SQL命令成功完成。

db2 export to orgdata.del of del modified by coldel; messages export.msg select * from org;

导出的行数:35

db2 import from orgdata.del of del modified by coldel; messages import.msg insert into orgtemp;

读取行数 = 35

跳过行数 = 0s

插入行数 = 35

更新行数 = 0

拒绝行数 = 0

落实行数 = 35

delprioritychar

移动DEL文件时另一个需要注意的问题就是保留定界符的正确优先顺序。定界符的默认优先级为:行,字符,列。但是,某些应用程序依赖于以下优先级:字符,行,列。例如,如果使用默认优先级,那么DEL数据文件

"Vincent is a manager",

将解释为两行:“Vincent”和“is a manager”,原因是优先于字符定界符(")。如果使用delprioritychar,那么字符定界符(")优先于行定界符(),这意味着同一DEL文件将正确地解释为一行:“Vincent is a manager”。

假设载入输入文件contactsdata.del的内容为:"Tallerico","123 Anyplace Street Ourtown H0H 0H0":

db2 create table contacts (lastname varchar(16), address varchar(64))

DB20000I SQL命令成功完成。

db2 load from contactsdata.del of del modified by delprioritychar messages load.msg insert into contacts

读取行数 = 1

跳过行数 = 0

装入行数 = 1

拒绝行数 = 0

删除行数 = 0

落实行数 = 1

db2 select * from contacts

LASTNAME ADDRESS

-------------- ---------------------------------------------------------

Tallerico 123 Anyplace Street Ourtown H0H 0H0

15.8.6 PC/IXF注意问题

PC/IXF格式注意事项

典型导出操作包括插入或装入到现有表中的所选数据的输出。但是,也可导出整个表,以便以后使用IMPORT实用程序重新创建。

要导出表,必须指定 PC/IXF文件格式。然后可通过CREATE方式使用IMPORT实用程序以重新创建已保存表(包括其索引)。但是,如果出现下列任一情况,那么某些信息不会保存至已导出IXF文件:

● 索引列名包含十六进制值0x2B或0x2D

● 该表包含XML列

● 该表是多维集群表(MDC)

● 该表包含表分区键

● 由于代码页转换而导致索引名长度超过128个字节

● 该表是受保护的

● EXPORT命令包含 SELECT * FROM tablename以外的操作字符串

● 对EXPORT实用程序指定了METHODN参数

注意:

不建议使用导入的CREATE方式。请使用db2look实用程序来捕获并重新创建表。

索引信息

如果索引中指定的列名包含“-”或“+”字符,那么不会收集索引信息,并且将返回警告 SQL27984W。EXPORT实用程序完成处理,并且不会影响已导出的数据。但是,索引信息未保存在IXF文件中。因此,您必须使用db2look实用程序来单独创建索引。

空间局限性

如果导出的数据超过创建导出文件所在文件系统的可用空间量,那么导出操作会失败。在这种情况下,应该通过在WHERE子句中指定条件来对选择的数据量进行限制,以使已导出文件能够存放在目标文件系统中。可以多次调用EXPORT实用程序以导出所有数据。表15-4列示了可用于PC/ IXF文件类型的文件类型修饰符。

表15-4 可用于PC/IXF文件类型的文件类型修饰符

修 饰 符

IMPORT

LOAD

描 述

indexixf

yes

no

指定导入实用工具将删除表上所定义的所有索引,并由PC/IXF文件中的索引定义创建一个新的。该文件类型修饰符只能在表中内容要被替换时使用

nochecklengths

yes

yes

指定即使输入数据超出了目标表列的大小,也应该尝试导入或载入每一行。如果您知道输入数据将适合所有情况,那么就可以使用该文件类型修饰符

indexixf示例:

db2 create table newemp like employee

DB20000I SQL命令成功完成。

db2 export to empdata.ixf of ixf messages export.msg select * from employee

导出的行数:42

db2 import from empdata.ixf of ixf modified by indexixf messages import.msg replace_create into newemp

读取行数 = 42

跳过行数 = 0

插入行数 = 42

更新行数 = 0

拒绝行数 = 0

落实行数 = 42

nochecklengths示例:

db2 create table resumes like emp_resume

DB20000I SQL命令成功完成。

db2 export to emp_resumedata.ixf of ixf messages export.msg select * from emp_resume

导出的行数:8

db2 load from emp_resumedata.ixf of ixf modified by nochecklengths messages load.msg insert into resumes

读取行数 = 8

跳过行数 = 0

装入行数 = 8

拒绝行数 = 0

删除行数 = 0

落实行数 = 8

15.8.7 代码页不同注意事项

如果我们导入或装入数据时,表的数据页和输入文件的数据页不匹配,那么数据将无法导入,而且会报一个SQL0332N的错误。这种情况下我们可以使用下面的文件类型修饰符。

forcein文件类型修饰符

forcein 文件类型修饰符允许导入PC/IXF文件,指定导入或载入实用工具不会由于代码页不匹配而拒绝数据,并取消代码页之间的转换。该文件类型修饰符在使用时必须谨慎,但是当处理包含了其他情况下无法导入或载入的数据类型或值时,该文件类型修饰符,十分有用。此选项不会理会PC/IXF文件与目标数据库中的数据之间的代码页差别。它允许更加灵活地定义兼容列。

db2 create table resumes like emp_resume

DB20000I SQL命令成功完成。

db2 export to emp_resumedata.ixf of ixf messages export.msg select * from emp_resume

导出的行数:8

db2 load from emp_resumedata.ixf of ixf modified by forcein messages load.msg insert into resumes;

读取行数 = 8

跳过行数 = 0

装入行数 = 8

拒绝行数 = 0

删除行数 = 0

落实行数 = 8

codepage文件类型修饰符

指定一个ASCII字符串,用于表示要导入或载入数据的源代码页。如果您需要在运行于不同代码页的系统之间移动数据时避免讹误,那么该文件类型修饰符十分有用。首先会将输入文件中的字符数据从该文件类型修饰符所指定的代码页转换成当前的系统代码页,然后从当前系统代码页转换成数据库代码页。请记住,如果输入文件包含了当前系统代码页不能识别的字符,那么就无法将该字符导入或载入数据库。而且,在代码页转换中占用空间变大的数据可能会被截掉。

db2 create table stafftemp like staff

DB20000I SQL命令成功完成。

db2 export to staffdata.del of del messages export.msg select * from staff

导出的行数:35

db2 load from staffdata.del of del modified by codepage=850 messages load.msg insert into stafftemp

读取行数 = 35

跳过行数 = 0

插入行数 = 35

更新行数 = 0

拒绝行数 = 0

落实行数 = 35

15.8.8 日期格式

在不同的平台和系统上进行数据移动时,日期格式容易出问题。下面我们讲解几个和日期格式有关的文件类型修饰符。这几个文件类型修饰符仅适用于ASC和DEL格式。

dateformat

dateformat=" x"指定一个字符串,用于表示导入或载入数据的日期格式。每个未指定的元素将被赋值为1。

考虑导入数据文件salesdata.asc的内容为“23.04.2004LUCCHESSI++++++Ontario- South+++++++++++10 2”:

db2 create table salestemp like sales

DB20000I SQL命令成功完成。

db2 import from salesdata.asc of asc modified by dateformat="DD.MM.YYYY" method l (1 10, 11 25, 26 40, 41 51) messages import.msg insert into salestemp

读取行数 = 1

跳过行数 = 0

插入行数 = 1

更新行数 = 0

拒绝行数 = 0

落实行数 = 1

datesiso

指定以ISO格式导出所有日期格式:

db2 export to salesdata.del of del modified by datesiso messages export.msg select * from sales

timeformat

timeformat=" x"指定一个字符串,用于表示导入或载入数据的时间格式。每个未指定的元素将被赋值为0。

考虑载入输入文件timedata.asc的内容为“10.56 PM”:

db2 create table times (timeofday time)

DB20000I SQL命令成功完成。

db2 load from timedata.asc of asc modified by timeformat="HH.MM TT" method l (1 8) messages load.msg insert into times

读取行数 = 1

跳过行数 = 0

插入行数 = 1

更新行数 = 0

拒绝行数 = 0

落实行数 = 1

timestampformat

timestampformat="x"指定一个字符串,用于表示导入或载入数据的时间戳格式。在指定month和minute元素时,一定要避免二义性,因为两者都使用了字母“m”。month元素必须邻接其他日期元素,而minute元素必须邻接其他时间元素:

db2 create table in_traytemp like in_tray

DB20000I SQL命令成功完成。

db2 insert into in_tray values ('2008-04-16-17.12.30.000000', 'db2inst1', 'Any subject', 'Any note text')

DB20000I SQL命令成功完成。

db2 export to in_traydata.del of del modified by timestampformat="yyyy.mm.dd hh:mm tt" messages export.msg select * from in_tray

导出的行数:4

db2 load from in_traydata.del of del modified by timestampformat="yyyy.mm.dd hh:mm tt" messages load.msg insert into in_traytemp

读取行数 = 4

跳过行数 = 0

插入行数 = 4

更新行数 = 0

拒绝行数 = 0

落实行数 = 4

15.8.9 XML问题

随着DB2 V9.1中引入了本地XML支持,导出(EXPORT)实用程序也被扩展,以支持 XML。如果没有指定任何与XML 相关的选项而导出一个表(用XML数据定义的),那么相关的XML 数据将被写入到与导出的其他关系数据分开的一个或多个文件中。让我们看一个例子。下面的EXPORT命令是在PRODUCT表上发出的,该表中定义了一个 XML列:

EXPORT TO prodexport.del DEL MESSAGES msg.out SELECT * FROM product

在这个例子中,导出实用程序将生成两个输出文件。其中一个输出文件是prodexport.del(如图15-9所示),该文件将包含表中的关系数据和XML Data Specifier(XDS)。

 

图15-9 输出文件prodexport.del的内容

XDS是用名为"XDS"的一个XML标记表示的字符串。它具有一些属性,用于描述关于列中实际的XML数据的信息。下面是XDS字符串中可能出现的一些属性:

● FIL:指定包含XML数据的文件的文件名。

● OFF:指定XML数据在FIL 属性指定的文件中的字节偏移量。

● LEN:指定FIL属性中指定的文件中的XML数据的字节长度。

● SCH:指定用于验证XML文档的XML模式的全限定SQL标识符。下一节中将讨论这个属性。

从图15-9所示的prodexport.del的内容中可以看出,第一个XML数据存储在prodexport.del.001.xml中,从 0 字节偏移位置开始,长度为252个字节。

在这个例子中,导出实用程序生成的另一个文件是prodexport.del.001.xml(图15-10所示),该文件包含XML内容。导出的每个XML数据都被连接在一起写入到这个文件中。

 

图15-10 输出文件prodexport.del.001.xml的内容

使用XML选项和修饰符导出XML数据

与导出大型对象一样,您可以指定被导出XML文档的存储路径,还可以指定输出文件的文件名。考虑下面的例子:

EXPORT TO prodexport.del DELXMLTO d:\xmlpath XMLFILE proddesc MODIFIED BY XMLINSEPFILES XMLNODECLARATION XMLCHAR XMLSAVESCHEMA MESSAGES msg.out SELECT * FROM product

在这个例子中,PRODUCT表的关系数据被导出到prodexport.del文件中。然后,所有XML数据都被写入到XML TO子句指定的目录d:\xmlpath中。包含XML数据的文件被命名为proddesc.ext.xml,其中ext 是一个序列号(例如 proddesc.001.xml、proddesc.002.xml、proddesc.003.xml等)。基本文件名是用XMLFILE选项定义的。

您也许还注意到,这个例子中使用了一些修饰符。下面对所有与XML相关的修饰符作一个总结:

● XMLINSEPFILES:导致导出实用程序将导出的每个XML文档写入到不同的XML文件中。

● XMLNODECLARATION:表明导出XML数据无需使用XML声明标记。默认情况下,XML标记被写在XML文档的开头,并包括一个编码属性。

● XMLCHAR:表明XML数据以字符码页编码。默认情况下,XML数据是以 UNICODE编码的。当使用这个修饰符时,使用的是codepage文件类型修饰符或应用程序码页。

● XMLGRAPHIC:表明无论是codepage文件类型修饰符还是应用程序码页,导出的XML数据都将以UTF-16码页编码。注意,这个例子中没有使用XMLGRAPHIC。

我们要介绍的最后一个选项是 XMLSAVESCHEMA。当插入一个XML文档时,可以用一个XML模式对其进行验证。XMLSAVESCHEMA选项导致导出实用程序保存用于每个导出的XML 数据的XML模式。该模式的全限定SQL标识符将被存储为相应的XML Data Specifier(XDS)中的一个SCH 属性。注意,如果没有用XML模式验证导出的XML文档,或者该模式对象不再存在于数据库中,那么相应的XDS中将不包括SCH属性。图15-11显示了前面的导出例子的结果。

 

图15-11 导出结果

你可能感兴趣的:(DB2,数据库,操作系统)