将现有应用程序移植到 DB2 for I

Porting an existing application to DB2 for I

由于客户的意愿,我公司正在将我们的软件移植到一个新的数据库(DB2 for iSeries (7.1))。当有一个自动升级系统时,它会掉落、改变和创造。 iSeries 似乎有一种非常特殊的方式来处理警告 - 查询消息。例如,当我通过 SQL (ADO.NET) 删除我们的库时,作业停止并等待用户输入。

填充 SYSRPYL 和 CALL QSYS2.QCMDEXC('CHGJOB INQMSGRPY(*SYSRPYL)') 是清除那些阻塞消息的唯一方法,还是有一些全局开关以便 iSeries 像普通数据库一样运行?如果我们需要填写这个 table 是否有办法获取所有相关消息,或者我们是否需要等待它们第一次发生才能做出反应?

另一个问题似乎是语法问题 - 我们在 MSSQL、Oracle 和 DB2 LUW 上有我们的项目 运行 - 在 iSeries 上,例如在连接中使用定义的 with 子句(连接something.col in (select othercol from W_WithClause)) 中的某些内容似乎不起作用。有没有办法让 iSeries 符合这个 SQLs,或者我们是否需要重新测试所有内容并重写我们的 SQLs?

您可能会查看 INQMSGRPY(*DFT)...

但是您必须查看消息并查看它们是否具有默认值以及默认值是什么。您可以使用显示消息描述 (DSPMSGD) 命令来查找消息的默认值。

例如,删除新创建的模式至少会导致 CPA7025 - CWTEST 中的接收者 QSQJRN0001 从未完全保存。 (我C)

该消息的默认设置是 I-Ignore。

就SQL语法兼容性而言,恐怕您唯一的选择就是重写语句。 Db2 for i 不是 Oracle,也不是 MS SQL Server,甚至不是 DB2 for LUW。 DB2 for i 的代码库与 DB2 for LUW 的代码库和 DB2 for z/OS 的代码库是分开的。

如果您还没有找到它,IBM DB2 for i Porting Information 页面是一个很好的起点。

从好的方面来说,由于 IBM DB2 for i 非常严格地遵循 ANSI/ISO SQL 标准,适用于 DB2 for i 的语句很可能适用于其他数据库。这是您当前对其他数据库使用的非标准语法,会给您带来麻烦。

不利的一面是,v7.1 已经超过 6 年了。 v7.2于2014年发布,v7.3于今年发布。因此,您将错过一些较新的功能。一些增强功能被移植回早期版本。 您可以查看 DB2 for i - Technology Updates 页面。

最好解决任何消息的原因。要解决原因,我们需要确定看到的是什么消息。 Charles 指出的 CPA7025 是最有可能的,但根据所涉及的步骤顺序,其他的也可能是。

如何解决 CPA7025 条件的一个示例可以通过此 SQL 语句序列来演示:

CREATE COLLECTION TSTDLTLIB ;

CREATE TABLE TSTDLTLIB.TSTDLT ( K1 ROWID NOT NULL, F1 VARCHAR (20 )
NOT NULL WITH DEFAULT, F2 REAL NOT NULL WITH DEFAULT ) ;

INSERT INTO TSTDLTLIB.TSTDLT VALUES( default, 'Value 1', 999 ) ;

CL: ENDJRNLIB LIB( TSTDLTLIB ) ;
CL: ENDJRNPF FILE( *ALL ) JRN( TSTDLTLIB/QSQJRN ) ;
CL: DLTJRN JRN( TSTDLTLIB/QSQJRN ) ;
CL: DLTJRNRCV JRNRCV( TSTDLTLIB/QSQJRN* ) DLTOPT( *IGNINQMSG ) ;

DROP COLLECTION TSTDLTLIB CASCADE ;

该序列使用单个简单 table 创建一个模式,将一行插入 table,然后删除该模式。但在 DROP 之前,一系列简短的系统命令可确保处理作为架构一部分的默认日志。

SQL 模式将有一个日志,用于维护提交控制和协助恢复。在 IBM i 下,需要正确管理日志接收器。一个预期的项目是接收器将在被删除之前被保存。因此,CPA7025,"Receiver &1 in &2 never fully saved."

通过终止可能首先存在的任何活动期刊链接,可以删除期刊本身。可以使用各种 ENDJRNxxx 命令。可能只需要 ENDJRNPF 命令,但也可能不需要。删除日志后,可以删除关联的接收者。

DLTJRNRCV 命令将删除所有一般名为 QSQJRN* 的接收者,它应该适合默认的 SQL 期刊接收者。并且应该没有查询消息,因为该命令将 DLTOPT( *IGNINQMSG ) 指定为 "ignore inquiry messages".

现在,您实际如何实施将取决于您流程的特定细节。知道的多了再说。