将 Informix ESQL/C 应用程序迁移到 DB2

本资料无预览

如感兴趣请购买后下载

立即下载

资料简介:
简介
IBM Informix ESQL/C 是一个结构化查询语言(Structured Query Language,SQL)应用程序编程接口(API),它允许您将 SQL 语句直接嵌入到 C 程序中。在 IBM Informix ESQL/C Version 2.90 之前,您只能为 IBM Informix Dynamic Server(IDS)编写 ESQL/C 应用程序。且只能使用 IBM Informix Enterprise Gateway Manager(EGM)连接 DB2。EGM 使用的是内部 SQLI/ASF 接口,该接口是所有 IBM Informix 客户端产品的通信骨干(backbone)。现在,在 Version 2.90 中,通过少量修改或者不进行任何修改,就可以将现有的 ESQL/C 应用程序迁移到 DB2。ESQL/C-DB2 功能将使用 DB2-CLI 层。您可以使用 ESQL/C-DB2 编写新的应用程序,使用 IBM Informix ESQL/C 与 DB2 数据库服务器进行通信,而无需使用其他任何内部或第三方产品,如 EGM。

平台支持
ESQL/C 利用 DB2-CLI 功能来连接 DB2 数据库。因此,ESQL/C-DB2 只在受 DB2-CLI 支持的平台上是可用的。受支持的平台有:
Solaris 32
Solaris 64
Hewlett Packard 32(11.11 或更高版本)
Hewlett Packard 64(11.11 或更高版本)
AIX 32(5.1 或更高版本)
AIX 64(5.1 或更高版本)
Linux 32
Windows 2000


ESQL/C-DB2 编译器
ESQL/C 是一个允许您将 SQL 语句直接嵌入到 C 程序中的 SQL API。ESQL/C 预处理器 esqlc 会预先处理 *.ec 文件,创建一个用 C 函数替换所有嵌入式 SQL 语句的 *.c 文件。然后,该预处理器调用 C 编译器来编译所生成的 C 程序,并将结果对象文件链接到 ESQ/L-C 库。
ESQL/C-DB2 也是一个允许您嵌入 SQL 语句(包括 DB2 特有的语句)的 SQL API。本例中,ESQL/C-DB2 预处理器 esqlcdb2 将预先处理 *.ec 文件,创建一个用 C 函数替换所有嵌入式 SQL 语句的 *.c 文件。然后,该预处理器调用 C 编译器来编译所生成的 C 程序,并将结果对象文件链接到 ESQL/C-DB2 库。
启用 ESQL/C-DB2 功能
使用 esqlc 命令的 -db2 选项启用 ESQL/C-DB2 功能。例如:
$INFORMIXDIR/bin/esql -db2 filename .ec
或者,可以通过将 DB2CLI 环境变量设置为 1 来启用 ESQL/C-DB2。例如:
在 UNIX 上,对于 Bourne 或 Korn Shell,DB2CLI 环境变量的设置为:
DB2CLI=1; export DB2CLI
在 UNIX,对于 C Shell,DB2CLI 环境变量的设置为:
setenv DB2CLI  1
在 Windows 上,可以使用 Setnet32 来设置 DB2CLI。
当在该环境中设置 DB2CLI 环境变量时,ESQL/C-DB2 编译器将忽略 -db2 选项,并将应用程序编译成访问 DB2,而非访问 IDS。
在启用 ESQL/C-DB2 功能时,ESQL/C 预处理器执行数据类型的转换,映射向 DB2 传递或从 DB2 传递的数据类型。此外,预处理器还在预编译阶段进行运行时的语法转换,以支持特定于 DB2 的语法。在所转换的 *.c 文件中,较高级别的 SQLI 函数的名称和范围保持不变,同时这些函数将在内部调用 DB2-CLI 函数,如下例所示:
sqli_connect_open() or sqli_exec_immed()
2012-09-21
浏览3110
下载0

已下载用户的评价

您还未下载该资料,不能发表评价;
查看我的 待评价资源
zhixianzhixian业务经理电信2012-09-21
没用
限制 ESQL/C-DB2 不支持下列数据类型: Interval。在使用该数据类型时,ESQL/C 应用程序将返回语法错误。您可以在一个主变量中指定该语法,并使用该主变量执行准备。在这样的例子中,编译时不报告任何错误,仅在运行时返回错误。 Smart Large Objects。DB2 对于诸如 does not have explicit support for simple large objects like the IBM Informix BYTE 和 TEXT 数据类型的简单大型对象(large object)没有予以显式支持。DB2 支持 BLOB(Binary Large Objects)、CLOB(Character Large Objects)和 DBCLOBS(双字节对象)。BYTE 和 TEXT 分别映射 CLOB 和 BLOB。注意,这些 DB2 数据类型不是智能的大型对象。 在下列场景中,不可能发生 MATCHES 到 LIKE 的替换: 如果模式就是一个主变量,如下例所示:[code]SELECT * FROM t WHERE b MATCHES :pattern;[/code]如果转义字符是一个主变量,如下例所示:[code]SELECT * FROM t WHERE b MATCHES 'abdf$apos; escape :c;[/code]如果模式包含 [] 通配符,如下例所示:[code]SELECT * FROM tab WHERE b MATCHES $apos;a[db]$apos;;[/code]
zhixianzhixian业务经理电信2012-09-21
没用
迁移到 DB2 的应用程序修改提示 DB2 完全支持与 ANSI 兼容的 SQL 语法,而 IBM Informix Dynamic Server 不支持。为了理解可能有必要对 DB2 运行应用程序执行的修改,最好使用 -ansi 选项,因为这将有助于识别不遵循 ANSI 标准和可能需要为 DB2 进行修改的所有语句。注意,使用 $ 符号代替 EXEC SQL 语句这一点是与 ANSI 不兼容的。 如果现有的应用程序是按照 ANSI 标准编写的,那么它不需要进行修改。 BOOLEAN 的客户端表示是 CHAR。在迁移中,IBM Informix SQL 类型 BOOLEAN 将迁移到一个 CHAR(1) 数据类型。如果这存在问题,则必须手工更改它。 LVARCHAR 映射至 DB2 VARCHAR。 IDS BYTE 和 TEXT 数据类型分别映射 DB2 BLOB 和 CLOB 类型。 表 2. IDS 和 DB2 之间的数据类型映射 下表指定 IDS 和 DB2 数据类型之间的映射。 [attach]111103[/attach]
zhixianzhixian业务经理电信2012-09-21
没用
ESQL/C-DB2 如何处理 IDS 和 DB2 之间的不同 这一节将描述 IDS 与 DB2 在函数上存在的不同,以及 ESQL/C-DB2 编译器如何处理它们。 DB2 所不支持的函数支持 DB2 不支持客户机应用程序中的 CREATE DATABASE 或 DROP DATABASE 语句。DB2 需要通过 DB2 管理工具来执行这些语句。然而,ESQL/C-DB2 功能允许执行这些语句,但它没有提供各种选项;如果在应用程序的 SQL 语句中指定选项,那么将删除这些额外的选项,而分析器不会抛出错误。 例如,将语句 CREATE DATABASE newdb IN dbspace1 WITH LOG MODE ANSI 修改为 CREATE DATABASE newdb。 一些特定于 DB2 的基本语法的支持 ESQL/C-DB2 并非支持所有特定于 DB2 的语法。然而,ESQL/C-DB2 功能允许用户通过在 DB2 语句中追加了 EXECUTE DB2 的 ESQL/C 应用程序来执行这些语句。 使用该格式:EXEC SQL EXECUTE DB2 statement ,其中,statement 遵循 DB2 语法,并直接发送给数据库服务器,无需使用分析器进行语法和语义分析。 例如,使用 DB2 特有的语法创建一个表: EXEC SQL " EXECUTE DB2 CREATE TABLE tab1 (column1 int generated by default as identity )"; 注意:您可以在 CREATE TABLE 语句中使用 DB2 特有的数据类型。这不会引起任何错误,因为编译器假定该数据类型为用户定义的数据类型,且在运行时之前不会引起任何错误。例如:EXEC SQL create table tab1 (column1 bigint);,其中,bigint 是 DB2 特有的数据类型。 在没有设置 DELIMIDENT 环境变量时,可以用单引号字符串替换双引号字符串 虽然 IDS 同时支持双引号和单引号字符串,但 DB2 只支持单引号字符串。为了对 DB2 运行使用类似 "" 这样的双引号字符串的应用程序,需要用单引号字符串替换这些字符串。 例如,下列语句包含了一个双引号字符串: EXEC SQL SELECT * FRM tab1 WHERE color = "pred"; 该语句将修改为具有单引号字符串: EXEC SQL SELECT * FRM tab1 WHERE color = 'pred'; 然而,双引号中包含的一个字符串文字没有更改,因此将返回一个语法错误;您必须手工将其修改为使用单引号。 例如,下列语句中,在双引号包围的字符串文字中使用了双引号: EXEC SQL prepare prep1 from "select * from tab1 where color = "red""; 分析器将该语句修改为: EXEC SQL prepare prep1 from 'select * from tab1 where color = "red"'; 您必须用 'red' 手工替换字符串 "red"。 替换某些 DB2 不支持的关键字 分析器必须将关键字 UNIQUE 转换成 DISTINCT(或将 DISTINCT 转换成 UNIQUE),以使其符合 ANSI 标准。 将所有存在的 UNIQUE 关键字都替换成 DISTINCT 关键字。因为两个例子中的结果集不会改变,所以可以直接进行替换。 用 LIKE 替换 MATCHES DB2 不支持 MATCHES 关键字。例如: SELECT col1 FROM tab1 WHERE col1 MATCHES "a*b" 分析器对关键字、模式(pattern)符号和转义(escape)符号执行下列操作: 如果操作符是 MATCHES,并且模式和转义字符都指定为文字,那么 MATCHES 将被转换成 LIKE。 在将操作符 MATCHES 替换成 LIKE 的同时,模式 * 和 ? 将分别替换成 % 和 _。 如果 * 和 ? 符号是由 IBM Informix 默认转义或用户指定转义进行转义的,那么就会删除转义字符,并替换掉 * 和 ?。 注意:如果模式或转义字符是一个主变量,或者模式中包含 [ ] wild 字符,那么就不会发生转换。 例如,下列模式具有进行转义的 *、?、[, or ]: MATCHES 'a*b*[' 分析器将 MATCHES 转换成 LIKE,并从模式中去掉转义(ESCAPE)字符: LIKE 'a%b*[' 下列模式拥有被转义的 *、?、[, or ]: MATCHES 'a*b*[' 分析器将 MATCHES 转换成 LIKE,并从模式中去掉转义(ESCAPE)字符: LIKE 'a%b*[' 对于大于 254 个字符的 VARCHAR 大小的支持 DB2 所支持的 VARCHAR 列的大小高达 32K,而 IBM Informix 仅支持 254 个字符。ESQL/C-DB2 支持的 VARCHAR 列的最大长度为 32K。声明和使用大于 254 个字符长度的 VARCHAR 数据类型不会出任何错误。 参照完整性约束 在 DB2 和 IDS 中,在表上定义约束的方式有点不同,如下列 DB2 语法实例: CREATE TABLE tab1 (col2 SMALLINT NOT NULL, col3 CHAR(40) NOT NULL, CONSTRAINT pk_col2 PRIMARY KEY (COL2)) ; IDS 使用下列语法: CREATE TABLE tab1 (col2 SMALLINT NOT NULL, col3 CHAR(40) NOT NULL, PRIMARY KEY (col2) CONTRAINT pk_col2) ; 在 DB2 中,支持 ADD CONSTRAINT 和 DROP CONSTRAINT 语法,但不支持在圆括号中映射多个约束列表,如下例所示: ALTER TABLE tab ADD CONSTRAINT (id UNIQUE, name PRIMARY KEY) 下列代码将返回错误: ALTER TABLE tab ADD (zipcode char(4) PRIMARY KEY) 聚集函数映射 从 IDS 到 DB2 有一些一对一的聚集函数映射,同时,它们还具有完全相同的函数名。例如,USER() 和 COUNT()。有几个聚集函数具有相同的功能,但名称不同。分析器将修改函数名,以支持相应的 DB2 聚集函数。下表中提供了列表 ESQL/C-DB2 所支持的 SQL 函数以及 IBM Informix SQL 函数到相应 DB2 函数的映射。 表 1. IDS SQL 和 DB2 函数之间的映射 [attach]111101[/attach] 注意,只允许使用尾部空白符,因为 DB2 不支持其他任何尾部字符。 隔离级别支持 版本 V8.2 及更高版本的 DB2 都支持 SET ISOLATION isolation level 语法。该语法受到 ESQL/C-DB2 的支持,并且可以像其他任何动态 SQL 一样执行。受支持的隔离级别(isolation level)有: CURSOR STABILITY REPEATABLE READ DIRTY READ 这三种隔离级别也受 IDS 的支持,因此不需要在内部进行任何预处理器修改。 IDS 还支持一种附加的隔离级别:COMMITTED READ。虽然 DB2 也支持 COMMITTED READ 的语法,但是必须执行到 CURSOR STABILITY 的映射。关心这些问题是用户的责任。 同样,IDS 也支持隔离级别的可选参数,包括用于 CS、CR、DR 隔离级别的 RETAIN UPDATE LOCKS。ESQL/C-DB2 编译器将删除这些选项,因为 DB2 不支持这些选项。如果使用这些选项,那么编译器不会返回错误。您必须手工处理可能导致的问题。 过程支持 ESQL/C-DB2 支持 CREATE PROCEDURE 语法,该语法必须是特定于 DB2 语法的。为了通过程序创建 DB2 过程,需要在 CREATE PROCEDURE 语句之前加上 EXECUTE DB2 或 EXECUTE IMMEDIATE。 为了执行一个过程,需要使用 EXECUTE PROCEDURE 语句,该语句在预处理过程中将映射至 CALL 语句。 注意,虽然 DB2 支持使用 OUTPUT 参数,并返回过程的结果集,但 ESQL/C 不支持 OUTPUT 参数,因此,您无法使用带有 OUTPUT 参数的过程。 例如: EXEC SQL execute immediate "create procedure proc1 (in ini varchar(1)) language SQL begin declare global temporary table session.tmp4 as (select distinct author from book_tab) definition only on commit preserve rows; insert into session.tmp4 select distinct author from book_tab; end"; 用户定义的函数支持 ESQL/C-DB2 支持 CREATE FUNCTION 语法,但该语法必须是特定于 DB2 语法的。因此,为了创建 DB2 用户定义的函数(UDF),就要使用 EXECUTE IMMEDIATE "CREATE FUNCTION... ",其中 CREATE FUNCTION 语句要与 DB2 语法一致。 例如: EXEC SQL execute immediate "create function multiply(i integer, j integer) returns integer return i*j"; 注意下列几点: DB2 中的 UDF 将总是返回一个值,该值既可以单个值,也可以是一行或一个表。 为了执行返回单个值的 UDF,需要使用 IDS EXECUTE FUNCTION 语句,该语句在预处理过程中映射 VALUES 语句。 为了执行返回一个表的 UDF,该调用只能包含在带有 TABLE 关键字的 FROM 子句中,例如:SELECT * FROM TABLE(udf_name(par1,..)) as z;。 错误消息支持 在添加 10000 之后,向用户返回 DB2 的 SQLCODE。 例如,ESQL/C-DB2 将特定于 DB2 的 SQLCODE SQL204 返回为 10204。 在 ESQL/C 和 DB2 之间公用但具有不同意义的 SQLCODE 是按照下列方式进行处理的:如果它来自于 DB2,那么将在添加 10000 之后返回给用户,否则照原样返回。 注意,只在 ESQL/C 返回 SQLCODE 时,才可以修改应用程序来调用 rgetmsg(),因为 DB2 SQLCODE 还会伴随错误消息一起出现。

贡献者

zhixian业务经理,电信
X社区推广