2015-12-03 105 views
1

我們有一個持續的,間歇性的問題,因爲一個SQLRPGLE程序無法將數據加載到屏幕上。一位同事剛剛想出如何可靠地重現它,所以我一直在調試器中進行調查。是什麼導致這種DB2 for i SQL奇怪?

該程序打開一個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遊標設置爲* ENDMOD,但似乎沒有任何區別。

我們肯定會感激任何建議,看看還有什麼!

+1

什麼版本和發佈?您是否合理地使用PTF? – Charles

+0

V6R1M1,是的,PTF上的合理電流。 – zkarj

回答

0

遊標打開意味着模塊永不結束並關閉遊標。
sqlrpgle程序不得不中止某事。

數據十進制錯誤,選擇多行的結果,字段對於插入或更新太大。

sql錯誤的最佳實踐是sqlcode爲負數時的轉儲命令。

if sqlcode < 0 
    dump 
endif 

打開光標前的修補程序關閉。但請記住,您的程序退出仍有一個原因需要修復。

close mycursor; 
open mycursor; 
+0

如操作列表中所示,程序退出時,光標已成功關閉。 – zkarj

+0

我將在測試中添加SQLCODE <0和轉儲,但請注意SQL失敗,但程序當前不會崩潰。它只是從獲取中獲取沒有記錄(因爲光標問題),因此很高興地顯示一個空的子文件。 在重複的F5循環中(沒有發出外部連接),光標重複關閉並重新打開,沒有問題。同樣,如果不在外部引入CONNECT,我們可以重複退出並重新運行程序,問題不會發生。 – zkarj

+0

所以嘗試使用連接重置,如果它只在引入連接後失敗。 – danny117

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)結合,停止問題。

我認爲這是一個解決方法,但是一個很好的解決方法。

0

這聽起來很簡單...當你按下F5時,* IN05應該是關閉的,按下鍵會打開它。該行動應激活你正在做的任何事情。 -WHAT如果在過程循環中的某些東西正在踩在* IN05上,現在將它打開(假設在函數關閉時將其關閉),所以當它回滾時,連接已經建立。只是添加一個想法,因爲它聽起來像你的SQL是堅實的。

+0

有趣的思想,謝謝。 我已經在頭腦中運行了你的理論多次,但是我仍然無法克服最後兩個操作的矛盾 - 顯示光標既是開放的,也不是打開時沒有(SQL)操作。 – zkarj

相關問題