是什么导致这个DB2 for i SQL奇怪?

时间:2015-12-03 04:05:47

标签: sql cursor ibm-midrange db2-400

我们在SQLRPGLE程序中遇到了持续的间歇性问题,该程序无法将数据加载到屏幕上。一位同事刚刚想出如何可靠地重现它,所以我一直在调试器中进行调查。

程序打开一个SQL游标到远程系统来填充子文件,如果用户按下F5,它会关闭游标并重新打开它。在某些情况下,这会以一种有趣的方式失败。

发现的可重复过程是首​​先运行函数,退出,然后发出STRSQL(显示远程连接仍处于活动状态)和CONNECT RESET。然后退回命令行并重新启动该功能。这是第一次显示和按F5 ONCE后的工作。但是在第二次按F5时,光标变得奇怪,程序无法加载数据。

这是我在调试器中运行的事件序列以及每个键SQL函数之后的SQLSTATE值。我检查了每个显示器的第一个FETCH,只是作为一个健全性检查。连接每次都会重新连接(可能不必要)到远程系统。

Action          SQLSTATE    Meaning
Initial connect 0           OK
Open cursor     0           OK
First fetch     0           OK
F5 pressed      
Close cursor    0           OK
Reconnect       8002        Already connected
Open cursor     0           OK
First fetch     0           OK
F5 pressed
Close cursor    0           OK
Reconnect       8002        Already connected
Open cursor     0           OK
First fetch     0           OK
Exit program            
Close cursor    0           OK
STRSQL CONNECT      
Reconnect       8002        Already connected
Open cursor     0           OK
First fetch     0           OK
F5 pressed      
Close cursor    0           OK
Reconnect       8002        Already connected
Open cursor     0           OK
First fetch     0           OK
F5 pressed      
Close cursor    0           OK
Reconnect       8002        Already connected
Open cursor     24502       Already open
First fetch     24501       Cursor not open

在运行CONNECT RESET之前,按下F5循环无限期地工作。

退出该功能后,返回该功能仍然显示空列表(即光标问题仍然存在)但是如果程序的激活组被回收,则第一个显示和第一个F5再次工作,但是第二个F5会导致光标问题再一次。

我尝试运行RUNSQL SQL('CONNECT RESET'),但未能说明未达到承诺边界。它不会更新任何文件,因此不确定这是怎么回事。我们确实发现在CONNECT重置之前在STRSQL中运行COMMIT可以解决问题,但只是暂时像回收激活组一样。

我们还尝试将承诺控制设置为模块上的* NONE,并将Close SQL Cursor设置为* ENDMOD,但似乎没有任何区别。

我们肯定会感谢任何有关其他内容的建议!

3 个答案:

答案 0 :(得分:0)

光标打开表示模块从未结束并关闭光标 sqlrpgle程序不得不中止某事。

数据十进制错误,选择多行的结果,字段对于插入或更新来说太大。

只要sqlcode为负数,sql错误的最佳做法是转储命令。

close mycursor;
open mycursor;

在打开光标前关闭热修复。但请记住,您的程序退出仍有一个原因必须修复。

{{1}}

答案 1 :(得分:0)

虽然我仍然不明白最后两个事件如何在序列中有效,但我找到了一种方法来阻止CONNECT(外部或其他)成为一个问题。

在CRTSQLRPGI命令中有一个参数:

RDB connect method . . . . . . .   *DUW          *DUW, *RUW

* RUW的帮助文本让我觉得值得一试:

*RUW                                                                   
CONNECT (Type 1) semantics are used to support remote unit of work.
Consecutive CONNECT statements result in the previous connection   
being disconnected before a new connection is established.         

我发现RDBCNNMTH(*RUW)COMMIT(*NONE)结合可以解决问题。

我认为这是一种解决方法,但却是一种坚固的方法。

答案 2 :(得分:0)

这听起来很简单......当您按F5时,* IN05应该关闭,按键将其打开*。该行动应激活您正在做的任何事情。 -WHAT IF-过程循环中的某些东西正在踩踏* IN05,现在让它开启(假设你在功能关闭时将其关闭),所以当它回滚时,连接已经建立。只是添加一个想法,因为它听起来像你的SQL是可靠的。