不同的DB2版本差异

最近工作中需要写存储过程,包括ORACLE和DB2两个版本的数据库,ORACLE没什么问题,但DB2写出来的脚本在不同的数据库版本下表现有差异,脚本大概是这样的:

CREATE PROCEDURE GETNEWFLOWID(IN BkkpgOrgId VARCHAR(30), IN EntryDate VARCHAR(30), OUT FlowId VARCHAR(30))
BEGIN
SELECT NEXTVAL FOR S_TP_BOOKKEEPING_FLOW AS NEXTVAL INTO FlowId FROM SYSIBM.SYSDUMMY1;
SET FlowId = REPEAT(‘0’, 18 – LENGTH(FlowId)) || FlowId;
END;

这个脚本在DB2 9.7版本可以执行,但是在9.5上就会报错,类型转换的错误,修改脚本如下:

CREATE PROCEDURE GETNEWFLOWID(IN BkkpgOrgId VARCHAR(30), IN EntryDate VARCHAR(30), OUT FlowId VARCHAR(30))
BEGIN
SELECT CHAR(NEXTVAL FOR S_TP_BOOKKEEPING_FLOW) AS NEXTVAL INTO FlowId FROM SYSIBM.SYSDUMMY1;
SET FlowId = REPEAT(‘0’, 18 – LENGTH(FlowId)) || FlowId;
END;

修改后的脚本在9.5版本上可以执行,但是出来的字符串只有14位,在9.7版本上会报错,我把SELECT之后的FlowId用LENGTH获取长度,发现9.5版本上是11,而9.7版本上是30,所以9.7版本报错的原因就是因为REPEAT函数的第二个参数已经减为负数了。但是为什么9.5版本上字符串只有14位,现在还不知道,然后两个版本LENGTH返回的长度不同也还没搞清楚。最后我们把FlowId去空格,两个版本上的表现就一样了,出来的字符串有18位,最终代码如下:

CREATE PROCEDURE GETNEWFLOWID(IN BkkpgOrgId VARCHAR(30), IN EntryDate VARCHAR(30), OUT FlowId VARCHAR(30))
BEGIN
SELECT CHAR(NEXTVAL FOR S_TP_BOOKKEEPING_FLOW) AS NEXTVAL INTO FlowId FROM SYSIBM.SYSDUMMY1;
SET FlowId = trim(FlowId);
SET FlowId = REPEAT(‘0’, 18 – LENGTH(FlowId)) || FlowId;
END;

发表评论

电子邮件地址不会被公开。 必填项已用*标注