WEB开发网
开发学院数据库DB2 IBM InfoSphere Federation Server V9.7 中 VARCH... 阅读

IBM InfoSphere Federation Server V9.7 中 VARCHAR2 数据类型及相关语义的支持

 2010-08-11 00:00:00 来源:WEB开发网   
核心提示:简介本文介绍了 InfoSphere Federation Server V9.7 中对 VARCHAR2 数据类型及相关语义的支持,从 DB2 V9.5 开始,IBM InfoSphere Federation Server V9.7 中 VARCHAR2 数据类型及相关语义的支持,DB2 开始增加了一个新的数据类型

简介

本文介绍了 InfoSphere Federation Server V9.7 中对 VARCHAR2 数据类型及相关语义的支持。从 DB2 V9.5 开始,DB2 开始增加了一个新的数据类型 VARCHAR2。该功能作为 DB2 增强对其他数据库 SQL 尤其是 PL/SQL 支持的一部分,有效降低了客户应用程序从 Oracle 向 DB2 移植的难度。而 InfoSphere Federation Server 作为 DB2 数据库的延伸,也需要增加对 VRACHAR2 数据类型以及其相关语义的支持。特别当联邦数据库支持 VARCHAR2 时,根据远程数据源是否支持 VARCHAR2,InfoSphere Federation Server 如何保证正确的语义处理。

本文将首先介绍什么是 VARCHAR2 数据类型。然后介绍如何在 InfoSphere Federation server 中使用 VARCHAR2 数据类型。最后根据远程数据库和联邦数据库支持该特性与否组合生成四种配置,以及每种配置下对字符串操作的影响。

1. VARCHAR2 数据类型

VARCHAR2 最初是由 Oracle 开发的一种类似工业标准中 VARCHAR 的数据类型。但 VARCHAR2 在以下方面与标准 VARCHAR 存在差异:。

在 VARCHAR2 语义中,空字符串被存储为 NULL,而标准语义中允许空字符串;

在 VARCHAR2 语义中,变长字符串比较基于 non blank-padding 算法;而在标准语义中,变长字符串比较基于 blank-padding 算法;

不超过 255B 的常量字符串被存储为 CHAR,超过 254B 的常量字符串被存储为 VARCHAR2;VARCHAR2 的最大长度是 32672B;

标量函数的返回值如果是长度为 0 的字符串,那么该返回值为 NULL。

由 VARCHAR2 的这种定义所引出的相关字符串语义,我们称为 Oracle 字符串语义或者 VARCHAR2 语义。

DB2 增加了一个注册变量 DB2_COMPATIBILITY_VECTOR。当该变量设置为 0x20 时,创建的数据库遵循 VARCHAR2 语义。

例如:

清单 1. 创建遵循 VARCHAR2 语义的数据库

 db2set DB2_COMPATIBILITY_VECTOR=20; 
 db2 terminate; 
 db2stop; 
 db2start; 
 db2 create db SAMPLE1; 

这里创建的数据库 SAMPLE1 将遵循 VARCHAR2 语义。

清单 2. 创建不遵循 VARCHAR2 语义的数据库

 db2set DB2_COMPATIBILITY_VECTOR=; 
 db2 terminate; 
 db2stop; 
 db2start; 
 db2 create db SAMPLE2; 

这里创建的数据库 SAMPLE2 不遵循 VARCHAR2 语义。

可以通过命令”db2 get db cfg”来检查相应数据库是否支持该语义。

清单 3. 检查数据库是否支持 VARCHAR2 语义

 db2 => get db cfg for SAMPLE1; 
 
    Database Configuration for Database SAMPLE1 
 
 Database configuration release level          = 0x0d00 
 Database release level                 = 0x0d00 
 
 Database territory                   = US 
 Database code page                   = 1208 
 Database code set                    = UTF-8 
 Database country/region code              = 1 
 Database collating sequence               = SYSTEM_819 
 Alternate collating sequence       (ALT_COLLATE) = 
 Number compatibility                  = OFF 
 Varchar2 compatibility               = ON 
 Date compatibility                   = OFF 
 Database page size                   = 4096 
…… 

2. Federation Server 中如何使用 VARCHAR2 数据类型

InfoSphere Federation Server v9.7 支持两种模式。缺省模式是不支持 VARCHAR2 语义的;另外一种是 VARCHAR2 兼容模式,支持 VARCHAR2 语义。后一种模式的打开是通过在创建联邦数据库之前设置注册变量 DB2_COMPATIBILITY_VECTOR 为 0x20( 该变量的缺省值是 0)。

需要指出的一点是,在 VARCHAR2 兼容模式下,DB2 及 Federation Server 支持 VARCHAR2 数据类型。VARCHAR2 和 VARCHAR 是同义词。而且在 catalog 中最终存储的数据类型是 VARCHAR。也就是说在 VARCHAR2 兼容模式下,VARCHAR 与 VARCHAR2 具有相同的语义。而在 catalog 中,VARCHAR2 类型并不存在。

InfoSphere Federation Server v9.7 为支持 VARCHAR2 语义,引入了两个新的 server options:

VARCHAR2_COMPAT:表明远程数据源是否支持 VARCHAR2 语义。对于 Oracle 数据源,该属性缺省为’ Y ’;对于其他数据源缺省为’ N ’;对于兼容 VARCHAR2 的 DB2 LUW 数据源,需要用户设置该属性为’ Y ’;对于通过 ODBC 或 JDBC 包装器来访问的兼容 VARCHAR2 的数据源,也需要用户设置该属性为’ Y'

NO_EMPTY_STRING:既是 server option,也是 column option。表明远程数据源或者远程 column 是否有空字符串。缺省值是’ N ’。当联邦数据库支持 VARCHAR2 语义,而远程数据源不支持 VARCHAR2 语义时,如果能判断远程数据源或者其某个列中不存在空字符串,设置该属性为’ Y ’,可以避免从空字符串到 NULL 的转换,从而提高性能

在开始使用 Federation 数据库前,我们需要做下面准备工作:

1) 打开 Federation 功能

db2 update dbm cfe using federated yes;

2)创建本地联邦数据库(创建支持 VARCHAR2 语义的联邦数据库,请参见上文)

db2 create db sample1 using codeset UTF-8 
 territory US authentication client;

3)连接到本地数据库

db2 connect to sample1;

4) 创建需要连接数据源的 Wrapper, Server 和 User Mapping

例如:连接 Oracle 数据源

清单 4. 连接 Oracle 数据源

 create wrapper net8; 
 create server "server1" type oracle version 11.0 wrapper " net8" 
 authorization "test" password "test" options(node 'ora11g', password 'y'); 
 create user mapping for user server "server1" options 
 ( remote_authid 'test', remote_password 'test' ); 

5) 创建 Nickname

例如:Oracle 上存在一个统计员工信息的表 EMP,通过下面的语句创建 Nickname ”EMP_LOCAL”

create nickname emp_local for server1."test"."emp";

下面给出如何设置及修改上述 server option 的例子:

例如:为远端不兼容 VARCHAR2 的 DB2 LUW 数据源创建 Server,显示地指定 Server options VARCHAR2_COMPAT, NO_EMPTY_STRING。

create server S type db2/cs version 9.7 wrapper W authorization "authid" password "pwd“ 
options (dbname 'DBNAME', VARCHAR2_COMPAT ‘ N ’ , NO_EMPTY_STRING ‘ Y ’ );

可以通过 Alter 语句修改 NO_EMPTY_STRING 的值。

alter server S options (set NO_EMPTY_STRING ‘ N ’ );

3. VARCHAR2 相关的 Federation Server 的四种配置

根据远程数据源和本地联邦数据库是否支持 VARCHAR2 语义,Federation server 有四种以下不同的配置:

a) 不支持 VARCHAR2 语义的 Federation Server 连接一个不支持 VARCHAR2 语义的远程数据源;

b) 不支持 VARCHAR2 语义的 Federation Server 连接一个支持 VARCHAR2 语义的远程数据源;

c) 支持 VARCHAR2 语义的 Federation Server 连接一个不支持 VARCHAR2 语义的远程数据源;

d) 支持 VARCHAR2 语义的 Federation Server 连接一个支持 VARCHAR2 语义的远程数据源;

图 1. InfoSphere Federation Server v9.7 四种配置
IBM InfoSphere Federation Server V9.7 中 VARCHAR2 数据类型及相关语义的支持

目前,支持 VARCHAR2 语义的远程数据源有 Oracle 数据库以及支持 VARCHAR2 语义的 DB2 LUW。其余的数据源缺省地被认为不支持 VARCHAR2 语义。

a) 和 b) 这两种配置在 InfoSphere Federation Server v9.7 之前的版本中已经支持,例如 InfoSphere Federation Server V9.5 中已经支持 Oracle 数据源。而 InfoSphere Federation Server v9.7 中将配置 b) 扩展到了支持 VARCHAR2 语义的 DB2 LUW。

c) 和 d) 是 InfoSphere Federation Server v9.7 中新支持的两种配置。要支持这两种配置,Federation Server 需要在创建联邦数据库之前设置”DB2_COMPATIBILITY_VECTOR = 0x20”,这样生成的联邦数据库将支持 VARCHAR2 语义。

对于 c) 配置情形,需要设置以下 server option 属性:

VARCHAR2_COMPAT = ‘ N ’

NO_EMPTY_STRING = ‘ Y ’ ( 可选 )

例如:

清单 5. 配置 c) 需要的 server options 设置

create server "server1" type informix version 11.0 wrapper "wrapper1" 
 authorization "test" password "test" options(varchar2_compat 'n', 
 node 'inf11', dbname 'inf11db', password 'y'); 
 
create server "server1" type mssqlserver version 2005 wrapper "wrapper1" 
 authorization "test" password "test" options(varchar2_compat 'n', 
 no_empty_string = ‘ y ’ node 'mssql2005', dbname 'mssql2005db', password 'y'); 

对于 d) 配置情形,需要设置

VARCHAR2_COMPAT = ‘ Y ’

例如:

清单 6. 配置 d) 需要的 server options 设置

create server "server1" type oracle version 11.0 wrapper "wrapper1" authorization "test" 
password "test" options(varchar2_compat 'y', node 'ora11g', password 'y'); 

下面我们将基于以下字符串操作讨论 Federation Server 在不同配置下的表现:

联邦 VARCHAR 字符串的比较;

联邦空字符串和 NULL 值

联邦基于字符串的函数;

3.1 联邦 VARCHAR 字符串的比较操作

比较操作包括基本谓词,group by, order by, sorting 等操作。

表 1 给出了四种配置下针对 VARCHAR 字符串比较操作的下推情况:

表 1. VARCHAR 字符串比较操作下推情况

 不支持 VARCHAR2 语义的联邦数据库支持 VARCHAR2 语义的联邦数据库
不支持 VARCHAR2 语义的远程数据源下推 (a)不下推 (c)
支持 VARCHAR2 语义的远程数据源(即 Oracle 或者支持 VARCHAR2 语义的 DB2 LUW)不下推(对基本谓词和 IN 操作进行补偿下推) (b)下推 (d)

配置 a),联邦数据库和远程数据源在 VARVCHAR 比较时均使用 blank-padding 算法。一般情形下,VARCHAR 比较操作将会被下推到远程数据源。

配置 b),联邦数据库使用 blank-padding 算法,远程数据源则使用 non blank-padding 算法。这种情况下,VARCHAR 比较操作将对基本谓词和 IN 操作带补偿的下推到远程数据源。

配置 c),联邦数据库使用 non blank-padding 算法,而远程数据源使用 blank-padding 算法。比较操作不会下推。

配置 d),联邦数据库和远程数据源均使用 non blank-padding 算法。比较操作将被下推。

下面是一个 blank-padding 及 non blank-padding 算法的例子:

在 blank-padding 算法中:’ abc ’ = ‘ abc ‘ => true

在 non blank-padding 算法中:’ abc ’ = ‘ abc ‘ => false

例如:

远端数据库存在如下一个员工表

create table emp(id int, name varchar(10))

其中包含如下两条纪录

insert into emp values(1,'jim')

insert into emp values(2,'jim ')

假设我们在联邦数据库中已经建立了表”emp”对应的 Nickname “emp_local”( 具体操作请参见上文 )

1)如果远端数据库为 Oracle, VARCHAR 比较操作使用 non blank-padding 算法 .

当通过客户端直接查找姓名为“JIM”的员工时将只返回第二条纪录。结果如下:

清单 7.Oracle 中的 VARCHAR 比较操作结果

 select * from emp where name='Jim '; 
 
 ID            NAME 
 ------------------------ ---------- 
 +2.00000000000000E+000 Jim 
 
 1 record(s) selected. 

如果使用联邦数据库工作

配置 b) 下 VARCHAR 比较操作将带补偿的下推到远程数据源(例子中的比较操作 name='Jim '将通过 RPAD 进行补偿:RPAD(A0."NAME" , 10, ' ')=RPAD('Jim ', 10, ' ')),从而保证比较操作 name= ’ Jim ‘将得到与联邦数据库支持的 blank-padding 算法相同的结果。结果如下:

清单 8. 联邦数据库配置 b) 中的 VARCHAR 比较操作结果

 select * from emp_local where name='Jim '; 
 
 ID            NAME 
 ------------------------ ---------- 
 +1.00000000000000E+000 Jim 
 +2.00000000000000E+000 Jim 
 
 2 record(s) selected. 

配置 d) 下 VARCHAR 比较操作将会下推到远程数据源,比较操作 name='Jim '将下推到 Oracle 数据源使用 non blank-padding 算法。结果如下:

清单 9. 联邦数据库配置 d) 中的 VARCHAR 比较操作结果

 select * from emp_local where name='Jim '; 
 
 ID            NAME 
 ------------------------ ---------- 
 +2.00000000000000E+000 Jim 
 
 1 record(s) selected. 

通过比较可以发现,如果远端数据源是 Oracle,配置 d) 表现出与 Oracle 客户端一致的行为。

2) 如果远端数据库为 Informix, VARCHAR 比较操作使用 blank-padding 算法 .

当通过客户端直接查找姓名为“JIM”的员工将获得所有两条纪录。结果如下:

清单 10.Informax 中的 VARCHAR 比较操作结果

 select * from emp where name='Jim ' 
 
 id     name 
 ----------- -------------------- 
     1 Jim 
     2 Jim 
 
 2 record(s) selected. 

如果使用联邦数据库工作:

配置 a) 下 VARCHAR 比较操作将会下推到远程数据源,上例中的比较操作 name='Jim '将下推到 Informix 数据源使用 blank-padding 算法。结果如下:

清单 11. 联邦数据库配置 a) 中的 VARCHAR 比较操作结果

 select * from emp_local where name='Jim ' 
 
 ID     NAME 
 ----------- ---------- 
     1 Jim 
     2 Jim 
 
 2 record(s) selected. 

配置 c) 下 VARCHAR 比较操作将不会下推,上例中的比较操作 name='Jim '将使用联邦数据库支持的 non blank-padding 算法。结果如下:

清单 12. 联邦数据库配置 c) 中的 VARCHAR 比较操作结果

 select * from emp_local where name='Jim ' 
 
 ID     NAME 
 ----------- ---------- 
     2 Jim 
 
 1 record(s) selected. 

通过比较可以发现,如果远端数据源是 Informix,配置 a) 表现出与 Informix 客户端一致的行为。

例外,

(1) VARCHAR FOR BIT DATA 比较继续按照带 IDENTITY 的 blank-padding 算法进行。

(2) Catalog 表中字符串列也按照带 IDENTITY 的 blank-padding 算法进行,并不考虑数据库的 code page。

3.2 空字符串和 NULL

支持 VARCHAR2 语义的数据库会将空字符串存储为 NULL,即数据库中不存在空字符串。

表 2 给出了四种配置下针对空字符串的处理:

表 2. 空字符串处理

 不支持 VARCHAR2 语义的联邦数据库支持 VARCHAR2 语义的联邦数据库
不支持 VARCHAR2 语义的远程数据源与 v97 之前的版本一样 (a)不下推 (c)
支持 VARCHAR2 语义的远程数据源(即 Oracle 或者支持 VARCHAR2 语义的 DB2 LUW)与 v97 之前的版本一样 (b)下推 (d)

配置 a),联邦数据库和远程数据源都支持空字符串,相关操作会下推。

配置 b),联邦数据库支持空字符串,而远程数据源不支持空字符串。如果远程数据源接收到空字符串,则远程数据源将其转换为 NULL 存储;如果空字符串插入到非 NULL 的列,那么数据源将报错。

配置 c),联邦数据库不支持空字符串,远程数据源支持空字符串。只有当能够保证联邦数据库语义和数据一致性的前提下,涉及到空字符串的操作才可以被下推

配置 d),联邦数据库和远程数据源都支持空字符串。由于在联邦数据库和远程数据源中执行结果一致,所以比较操作和涉及到空字符串的操作将会被下推

例如:

远端数据库存在如下一个部门表:

create table dep(id int, depname char(10) not null ,employ varchar(10))

现在需要插入如下两条纪录

insert into dep values(1,'','Ben') 
insert into dep values (2,'IT','')

1)如果数据源支持 VARCHAR2 语义,如 Oracle,通过 Oracle 客户端直接操作时,第一条纪录插入时将报错,第二条纪录将成功插入。

清单 13.Oracle 中插入 NULL 的结果

 insert into dep(id,depname,employ) values(1,'','Ben'); 
 DB21034E The command was processed as an SQL statement because it was not a 
 valid Command Line Processor command. During SQL processing it returned: 
 SQL0407N Assignment of a NULL value to a NOT NULL column "NET8 object: 
 Unknown" is not allowed. SQLSTATE=23502 
 
 insert into dep(id,depname,employ) values (2,'IT',''); 
 DB20000I The SQL command completed successfully. 
 
 select * from dep; 
 
 ID              DEPNAME  EMPLOY 
 ------------------------ ---------- ---------- 
 +2.00000000000000E+000 IT      - 
 
 1 record(s) selected. 

使用联邦数据库操作时,假设我们在联邦数据库中已经建立了表”dep”对应的 Nickname “dep_local”:

配置 b) 下,如果远程数据源接收到空字符串,则远程数据源将其转换为 NULL 存储;如果空字符串插入到非 NULL 的列,那么数据源将报错。上例执行结果如下:

清单 14. 联邦数据库配置 b) 下插入 NULL 的结果

 insert into dep_local(id,depname,employ) values(1,'','Ben'); 
 DB21034E The command was processed as an SQL statement because it was not a 
 valid Command Line Processor command. During SQL processing it returned: 
 SQL0407N Assignment of a NULL value to a NOT NULL column "NET8 object: 
 Unknown" is not allowed. SQLSTATE=23502 
 
 insert into dep_local(id,depname,employ) values (2,'IT',''); 
 DB20000I The SQL command completed successfully. 
 
 select * from dep_local; 
 
 ID            DEPNAME  EMPLOY 
 ------------------------ ---------- ---------- 
 +2.00000000000000E+000 IT     - 
 
 1 record(s) selected. 

这里需要特别说明的是对于 CHAR 类型列的操作。根据 DB2 的语义,将空字符串插到 CHAR 类型的列中时,空字符串在发送到远程数据源之前会被 blank-padded,即根据 CHAR 类型的长度将空字符串转为该长度的空格,远程数据源接收到的将是空格。上例中如果一次性插入两条纪录:

insert into dep_local(id,depname,employ) values(1,'','Ben'),(2,'IT','');

第一条纪录中的空字串在发送到远程数据源前会被扩展,远程数据源将接收到 10 个空格而不是空字符串。执行结果如下:

清单 15. 联邦数据库配置 b) 下向 CHAR 类型的列插入多行 NULL 的结果

 insert into dep_local(id,depname,employ) values(1,'','Ben'),(2,'IT',''); 
 DB20000I The SQL command completed successfully. 
 
 select id,depname,length(depname) as length from dep_local; 
 
 ID                 DEPNAME     LENGTH       
 ------------------------    ----------   -----------     
 +1.00000000000000E+000              10          
 +2.00000000000000E+000     IT        10          
 
 2 record(s) selected. 

另一方面对于单行插入或者更新操作,当联邦数据库发现操作是基于 nickname 时,会改变 DB2 的语义,直接将空字符串映射为 NULL,而不进行 blank-pad 操作。因此在例子中我们对 CHAR 类型非空列”depname”单行插入空串时,数据源返回如下错误信息:

清单 16. 联邦数据库配置 b) 下插入 CHAR 类型列插入单行 NULL 的结果

 SQL0407N Assignment of a NULL value to a NOT NULL column "NET8 object: 
 Unknown" is not allowed. SQLSTATE=23502” 

配置 d) 下,涉及到空字符串的操作将会被下推数据源 Oracle,结果如下:

清单 17. 联邦数据库配置 d) 下插入 NULL 的结果

 insert into dep_local values(1,'','Ben'); 
 DB21034E The command was processed as an SQL statement because it was not a 
 valid Command Line Processor command. During SQL processing it returned: 
 SQL0407N Assignment of a NULL value to a NOT NULL column "NET8 object: 
 Unknown" is not allowed. SQLSTATE=23502 
 
 insert into dep_local values (2,'IT',''); 
 DB20000I The SQL command completed successfully. 
 
 select * from dep_local; 
 
 ID              DEPNAME   EMPLOY 
 ------------------------ ---------- ---------- 
 +2.00000000000000E+000 IT      - 
 
 1 record(s) selected. 

2)如果数据源不支持 VARCHAR2 语义,如 Informix,通过 Informix 客户端直接操作时,两条纪录都可以成功插入;

清单 18.Informix 中插入 NULL 的结果

 insert into dep values(1,'','Ben') 
 DB20000I The SQL command completed successfully. 
 
 insert into dep values (2,'IT','') 
 DB20000I The SQL command completed successfully. 
 
 select * from dep 
 
 id      depname         employ 
 ----------- -------------------- -------------------- 
     1               Ben 
     2  IT            
 
 2 record(s) selected. 

使用联邦数据库操作时,假设我们在联邦数据库中已经建立了表”dep”对应的 Nickname “dep_local”:

配置 a) 下,相关操作会下推,结果如下:

清单 19. 联邦数据库配置 a) 下插入 NULL 的结果

 insert into dep_local values(1,'','Ben'); 
 DB20000I The SQL command completed successfully. 
 
 insert into dep_local values (2,'IT',''); 
 DB20000I The SQL command completed successfully. 
 
 select * from dep_local; 
 
 ID      DEPNAME   EMPLOY 
 ----------- ---------- ---------- 
     1         Ben 
     2  IT 
 
 2 record(s) selected. 

配置 c) 下,由于 Federation 数据库支持 VARCHAR2 语义空字符串将被存储为 NULL,结果如下:

清单 20. 联邦数据库配置 c) 下插入 NULL 的结果

 insert into dep_local values(1,'','Ben'); 
 DB21034E The command was processed as an SQL statement because it was not a 
 valid Command Line Processor command. During SQL processing it returned: 
 SQL0407N Assignment of a NULL value to a NOT NULL column "dep.depname" is not 
 allowed. SQLSTATE=23502 
 
 insert into dep_local values (2,'IT',''); 
 DB20000I The SQL command completed successfully. 
 
 select * from dep_local; 
 
 ID      DEPNAME   EMPLOY 
 ----------- ---------- ---------- 
     2  IT     - 
 
 1 record(s) selected. 

通过比较可以发现,如果远端数据源是 Informix,配置 a) 表现出与 Informix 客户端一致的行为。

3.3 scalar 函数

一般情况下,如果 Scalar 字符串函数的参数是 NULL,则返回值通常也是 NULL。而在 VARCHAR2 语义中,长度为 0 的 CHAR 或者 VARCHAR 字符串也被认为是 NULL 值。例如,UPPER(),LOWER(),LENGTH(),CHARACTER_LENGTH() 等。

而且,如果某 scalar 字符串函数在不支持 VARCHAR2 语义的模式下返回空字符串,则该函数在 VARCHAR2 模式下将返回 NULL 值。例如,TRIM(),SUBSTR() 等。

VARCHAR2 语义给某些基于字符串的 SYSIBM 函数带来的语义变化,如 CONCAT()。CONCAT (c1,null) 在不支持 VARACHAR2 语义的 DB2 中的返回值是 NULL,在 oracle 或者支持 VARCHAR2 语义的 DB2 中的返回值是 c1. 类似的函数有 INSERT(), REPLACE() 等。

上面提到的 scalar 字符串函数在配置 (a) 和 (d) 中将被下推,而在配置 (b) 和 (c) 中不会下推。表 3 给出了四种配置下针对上述 scalar 函数的处理。

表 3. scalar 函数的处理

 不支持 VARCHAR2 语义的联邦数据库支持 VARCHAR2 语义的联邦数据库
不支持 VARCHAR2 语义的远程数据源下推 (a)不下推 (c)
支持 VARCHAR2 语义的远程数据源不下推 (b)下推 (d)

例如:

远端数据库存在如下一个经理表:

create table manager(id int,department char(20),manager varchar(10)) 

现在需要插入如下两条纪录

insert into manager values(1,'IT','') 
insert into manager values(1,'Others',null)

1)如果数据源支持 VARCHAR2 语义,如 Oracle,通过 Oracle 客户端直接操作将得到如下结果:

清单 21. Oracle 中使用函数 upper 返回所有记录中大写的 manager 名字的结果

 select id,department,upper(manager) as manager from manager; 
 
 ID              DEPARTMENT       MANAGER 
 ------------------------ -------------------- ---------- 
 +1.00000000000000E+000 IT            - 
 +2.00000000000000E+000 Others         - 
 
 2 record(s) selected. 

清单 22. Oracle 中使用函数 substr 返回所有记录中 departname 从第一个字符起 0 长的子字串的结果

 select id,substr(department,1,0) as department from manager; 
 
 ID              DEPARTMENT 
 ------------------------ ---------- 
 +1.00000000000000E+000 - 
 +2.00000000000000E+000 - 
 
 2 record(s) selected. 

清单 23. Oracle 中使用函数 CONCAT 使返回记录中 manager 姓名前加上’ Mr ’的结果

 select id,concat('Mr',manager) as manager from manager; 
 
 ID              MANAGER 
 ------------------------ ------------- 
 +1.00000000000000E+000 Mr 
 +2.00000000000000E+000 Mr 
 
 2 record(s) selected. 

使用联邦数据库操作时,假设我们在联邦数据库中已经建立了表”manager”对应的 Nickname “manager_local”

配置 b) 下,scalar 字符串函数不会被下推。上例中的结果如下:

清单 24. 联邦数据库配置 b) 中使用函数 UPPER 返回所有记录中 manager 的名字的结果

 select id,department,upper(manager) as manager from manager_local; 
 
 ID                  DEPARTMENT        MANAGER   
 ------------------------     --------------------  ----------  
 +1.00000000000000E+000      IT             -       
 +2.00000000000000E+000      Others           -       
 
 2 record(s) selected. 

清单 25. 联邦数据库配置 b) 中使用函数 SUBSTR 返回所有记录中 departname 从第一个字符起 0 长的子字串的结果

 select id,substr(department,1,0) as department from manager_local; 
 
 ID              DEPARTMENT 
 ------------------------ ---------- 
 +1.00000000000000E+000 
 +2.00000000000000E+000 
 
 2 record(s) selected. 

清单 26. 联邦数据库配置 b) 中使用函数 CONCAT 使返回记录中 manager 姓名前加上’ Mr ’的结果

 select id,concat('Mr',manager) as manager from manager_local; 
 
 ID              MANAGER 
 ------------------------ ------------- 
 +1.00000000000000E+000 - 
 +2.00000000000000E+000 - 
 
 2 record(s) selected. 

配置 d) 下 , scalar 字符串函数会被下推。上例中的结果如下:

清单 27. 联邦数据库配置 d) 中使用函数 UPPER 返回所有记录中 manager 的名字的结果

 select id,department,upper(manager) as manager from manager_local; 
 
 ID                  DEPARTMENT        MANAGER   
 ------------------------     --------------------  ----------  
 +1.00000000000000E+000      IT             -       
 +2.00000000000000E+000      Others           -       
 
 2 record(s) selected. 

清单 28. 联邦数据库配置 d) 中使用函数 SUBSTR 返回所有记录中 departname 从第一个字符起 0 长的子字串的结果

 select id,substr(department,1,0) as department from manager_local; 
 
 ID              DEPARTMENT 
 ------------------------ ---------- 
 +1.00000000000000E+000 - 
 +2.00000000000000E+000 - 
 
 2 record(s) selected. 

清单 29. 联邦数据库配置 b) 中使用函数 CONCAT 使返回记录中 manager 姓名前加上’ Mr ’的结果

 select id,concat('Mr',manager) as manager from manager_local; 
 
 ID              MANAGER 
 ------------------------ ------------- 
 +1.00000000000000E+000 Mr 
 +2.00000000000000E+000 Mr 
 
 2 record(s) selected. 

通过比较可以发现,如果远端数据源是 Oracle,配置 d) 表现出与 Oracle 客户端一致的行为。

2)如果数据源不支持 VARCHAR2 语义,如 Informix,通过 Informix 客户端直接操作将得到如下结果:

清单 30. Informix 中使用函数 UPPER 返回所有记录中 manager 的名字的结果

 select id,department,upper(manager) as manager from manager 
 
 id      department                   manager 
 ----------- ---------------------------------------- -------------------- 
     1  IT 
     2  Others                      - 
 
 2 record(s) selected. 

清单 31. Informix 中使用函数 SUBSTR 返回所有记录中 departname 从第一个字符起 0 长的子字串的结果

 select id,substr(department,1,0) as department from manager 
 
 id     department 
 ----------- ---------- 
     1 
     2 
 
 2 record(s) selected. 

清单 32. Informix 中使用函数 CONCAT 使返回记录中 manager 姓名前加上’ Mr ’的结果

 select id,concat('Mr',manager) as manager from manager 
 
 id      manager 
 ----------- -------------------------- 
     1  Mr 
     2  - 
 
 2 record(s) selected. 

配置 a) 下 ,scalar 字符串函数会被下推。上例中的结果如下:

清单 33. 联邦数据库配置 a) 中使用函数 UPPER 返回所有记录中 manager 的名字的结果

 select id,department,upper(manager) as manager from manager_local; 
 
 ID     DEPARTMENT        MANAGER 
 ----------- -------------------- ---------- 
     1 IT 
     2 Others          - 
 
 2 record(s) selected. 

清单 34. 联邦数据库配置 a) 中使用函数 SUBSTR 返回所有记录中 departname 从第一个字符起 0 长的子字串的结果

 select id,substr(department,1,0) as department from manager_local; 
 
 ID     DEPARTMENT 
 ----------- ---------- 
     1 
     2 
 
 2 record(s) selected. 

清单 35. 联邦数据库配置 a) 中使用函数 CONCAT 使返回记录中 manager 姓名前加上’ Mr ’的结果

 select id,concat('Mr',manager) as manager from manager_local; 
 
 ID      MANAGER 
 ----------- ------------- 
     1  Mr 
     2  - 
 
 2 record(s) selected. 

配置 c) 下 , scalar 字符串函数不会被下推。上例中的结果如下:

清单 36. 联邦数据库配置 c) 中使用函数 UPPER 返回所有记录中 manager 的名字的结果

 select id,department,upper(manager) as manager from manager_local; 
 
 ID     DEPARTMENT        MANAGER 
 ----------- -------------------- ---------- 
     1 IT             - 
     2 Others          - 
 
 2 record(s) selected. 

清单 37. 联邦数据库配置 c) 中使用函数 SUBSTR 返回所有记录中 departname 从第一个字符起 0 长的子字串的结果

 select id,substr(department,1,0) as department from manager_local; 
 
 ID      DEPARTMENT 
 ----------- ---------- 
     1  - 
     2  - 
 
 2 record(s) selected. 

清单 38. 联邦数据库配置 c) 中使用函数 CONCAT 使返回记录中 manager 姓名前加上’ Mr ’的结果

 select id,concat('Mr',manager) as manager from manager_local; 
 
 ID      MANAGER 
 ----------- ------------- 
     1  Mr 
     2  Mr 
 
 2 record(s) selected. 

通过比较可以发现,如果远端数据源是 Informix,配置 a) 表现出与 Informix 客户端一致的行为。

Tags:IBM InfoSphere Federation

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接