是什么导致了这种DB2 for i SQL异常



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

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

发现的可重复过程是先运行函数,退出,然后发出STRSQL(显示远程连接仍处于活动状态)和CONNECT RESET。然后退出命令行,重新启动该函数。THIS WORKS on first display AND after pressing F5 ONCE(这在第一次显示和按F5一次后有效)。但第二次按下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,但两者似乎都没有任何区别。

我们当然会感谢任何关于其他内容的建议!

光标打开意味着模块从未结束并关闭光标
sqlrpgle程序由于某些原因不得不中止。

数据小数错误,选择多行的结果,字段太大,无法插入或更新。

sql错误的最佳实践是在sql代码为负数时使用dump命令。

if sqlcode < 0 
    dump
endif

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

close mycursor;
open mycursor;

虽然我仍然不明白最后两个事件如何按顺序有效,但我已经找到了一种方法来阻止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)相结合可以解决问题。

我认为这是一个变通办法,但却是一个可靠的办法。

这听起来很简单。。。当按下F5时,*IN05应该关闭,按下该键将其*ON。这个动作应该激活你正在做的任何事情-如果-过程循环中的某个东西踩到了*IN05,现在保持它*on(假设你在函数关闭时将其关闭),所以当它回滚时,连接已经建立。只是添加了一个想法,因为它听起来确实像您的SQL是可靠的。

最新更新