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

时间:2016-11-05 10:01:29

标签: ibm-midrange db2-400

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

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

另一个问题似乎是语法问题 - 我们的项目在MSSQL,Oracle和DB2 LUW上运行 - 在iSeries上比如在连接中使用一个定义的with子句(在something.col中加入一些东西)(从W_WithClause中选择othercol) ))似乎不起作用。有没有办法让iSeries符合这个SQL,还是我们需要重新测试所有内容并重写我们的SQL?

2 个答案:

答案 0 :(得分:3)

您可以查看INQMSGRPY(* DFT)...

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

例如,删除新创建的模式至少导致CPA7025 - CWTEST中的Receiver QSQJRN0001从未完全保存。 (I 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的语句可能适用于其他DB。它是您当前为其他数据库提供的非标准语法,会给您带来麻烦。

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

答案 1 :(得分:1)

最好应该解决任何消息的原因。为了解决这个问题,我们需要确定看到的是什么消息。查尔斯注意到的CPA7025最有可能,但其他可能取决于所涉及的步骤顺序。

此SQL语句序列可能会演示如何解决CPA7025条件的一个示例:

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 ;

序列创建一个包含单个简单表的模式,在表中插入一行,然后删除模式。但在DROP之前,一系列简短的系统命令可确保处理作为模式一部分的默认日志。

SQL架构将具有用于维护承诺控制和协助恢复的日志。在IBM i下,需要正确管理日志接收器。一个预期的项目是在删除之前保存接收器。因此,CPA7025,"& 2中​​的接收器& 1从未完全保存。"

通过结束可能存在的任何活动日记链接,可以删除日记本身。各种ENDJRNxxx命令都是可能的。可能只需要ENDJRNPF命令,但可能不需要。删除日志后,可以删除关联的接收者。

DLTJRNRCV命令将删除通常命名为QSQJRN *的所有接收器,这些接收器应该适合默认的SQL日志接收器。并且应该没有查询消息,因为该命令将DLTOPT(* IGNINQMSG)指定为"忽略查询消息"。

现在,您实际执行此操作的方式取决于流程的具体细节。如果知道更多,可以说更多。