由于工作需要将Sybase 数据库的存储过程迁移至DB2 数据库上,由于我之前没接触过Sybase 和DB2 所以这个学习过程相对来说比较曲折,我下面将迁移过程中遇到的各种问题总结在一起,方便以后翻阅,集锦会随着学习进度不断添加内容……
集锦格式:
错误提示:……
解决方法:……
1. 错误提示:DB2 SQL Error: SQLCODE=-104,SQLSTATE=42601, SQLERRMC=<cursor declaration>;;<SQL statement>,DRIVER=3.50.152
消息: Anunexpected token "<cursor declaration>" was found following"<cursor declaration>".
Expected tokens may include: "<SQL statement>".. SQLCODE=-104, SQLSTATE=42601,DRIVER=3.50.152
解决方法:DB2 声明变量要有序的要求:首先声明:普通变量;其次声明:游标;最后声明:condition handler。将游标的声明位置放到普通变量之后
2. 错误提示:DB2 SQL Error: SQLCODE=-104,SQLSTATE=42601, SQLERRMC=<variabledeclaration>;;<SQL statement>,DRIVER=3.50.152
消息: An unexpected token"<variable declaration>" was found following "<variabledeclaration>".
Expected tokensmay include: "<SQL statement>"..SQLCODE=-104, SQLSTATE=42601, DRIVER=3.50.152
解决方法:DB2 声明变量要有序的要求:首先声明:普通变量;其次声明:游标;最后声明:condition handler。将普通变量的声明位置放到最前面。
3. 错误提示:DB2 SQL Error: SQLCODE=-440,SQLSTATE=42884, SQLERRMC=PATINDEX;FUNCTION, DRIVER=3.50.152
消息: Noauthorized routine named "PATINDEX" of type "FUNCTION"having compatible arguments was found.. SQLCODE=-440, SQLSTATE=42884,DRIVER=3.50.152
解决方法:将 patindex 函数替换为 locate 函数。
4. Sybase 中的全局变量@@rowcount 在DB2 中如何使用?网上的解决办法如下:
答:db2中也有此全局变量,具体使用如下:
通过声明变量tempCount,使用语句
DECLARE TEMPCOUNT BIGINT DEFAULT = 0;
GET DIAGNOSTICS tempCount = ROW_COUNT;
问题:我在按照上面解决办法的时候会报一下错误提示sqlcode =-401 错误
解决方法:将定义类型 BIGINT 改为 INT