【发布时间】:2017-01-05 08:20:34
【问题描述】:
我们遇到了一个 SQLRPGLE 程序无法将数据加载到屏幕的持续性间歇性问题。一位同事刚刚弄清楚如何可靠地重现它,所以我一直在调试器中进行调查。
程序向远程系统打开一个 SQL 游标以填充子文件,如果用户按 F5,它会关闭游标并重新打开它。在某些情况下,这会以一种有趣的方式失败。
发现的可重复过程是先运行函数,退出,然后发出 STRSQL(显示远程连接仍处于活动状态)和 CONNECT RESET。然后退出命令行并重新启动该函数。这在第一次显示和按 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,但似乎都没有任何区别。
我们当然会很感激任何关于其他内容的建议!
【问题讨论】:
-
什么版本和发行版?您是否了解 PTF 的最新情况?
-
V6R1M1 是的,在 PTF 上相当流行。
标签: sql cursor ibm-midrange db2-400