2014-04-04 54 views
1

我在IBM i上運行Apache,爲CGI調用設置爲使用嵌入式SQL的RPG ILE程序。查找導致作業日誌SQL錯誤的CGI RPG程序

我得到不同的SQL錯誤,在這些程序(例如「指示器變量所需」和「光標不開」),但我無法找到該節目特別是造成這些問題。在這個系統中有數百個程序,在錯誤消息中打F1並沒有指定源程序(消息來自/到'QSQRUN2')。

我不能在調試模式下重新編譯每一個程序,這可能會提供更多的信息(生產系統,有些源的問題)。

有關如何獲取此信息的任何想法?

+0

STRTRC與TRCTYP * DBSQL是否提供更多信息? – Dko

+1

儘管您無法重新編譯調試,您能否將一個或多個服務器作業置於調試狀態(例如,通過STRSRVJOB)?或者針對一個或多個服務器作業啓動數據庫監視器(STRDBMON)以查看捕獲的內容。如果錯誤在過程內,則數據庫監視器應記錄過程名稱。任何調試或監視器只會暫時運行,以查看joblog或monitor數據庫是否記錄了有用的信息。 – user2338816

+0

@ user2338816 STRDBMON正是我所需要的! 'STRDBMON OUTFILE(QGPL/DBMON)JOB(* ALL/QTMHHTTP/WEBSERVER)FTRSQLCODE(* ERROR)'將列出所有帶有錯誤的SQL語句,它們的文本以及它們來自哪個程序!如果你想回答,我會給你。 – ScottR

回答

0

@ user2338816在評論中給出了這個答案。

有一種簡單的方法可以爲特定的作業添加SQL監視。

STRDBMON OUTFILE(QGPL/DBMON) JOB(*ALL/QTMHHTTP/WEBSERVER) FTRSQLCODE(*NONZERO) 

開始監視用戶QTMHHTTP,工作WEBSERVER所有作業(當前或未來),日誌記錄給予警告或錯誤的所有語句監視器。

上所產生的QGPL/DBMON數據庫文件的詳細信息,請參閱here

然後,您可以交叉引用在作業日誌作業數/時間,如果你需要一些背景。

1

哪裏看到錯誤?

你說「打F1 ......」你的意思擊中作業日誌F10 =顯示信息;來自WRKACTJOB屏幕上的7 = Display消息?

如果是這樣,嘗試5 =工作,以及11 =顯示調用堆棧..

如果作業不是進入MSGW,那麼你的程序吞嚥錯誤。要麼不恰當地不做任何事情。或者在處理完問題後(而忽略清理作業日誌)或記錄你需要的地方的數據。你只需要找出在哪裏。

+0

WRKACTJOB SBS(QHTTPSVR),5 =使用,10 =顯示作業日誌。 – ScottR

+0

這些是SQL錯誤,它們不會產生MSGW消息(這實際上是一件好事)。他們只是在作業日誌中記錄一條消息並繼續。調用堆棧沒有幫助,因爲在我看到錯誤時,CGI作業已經到達下一個Web請求。 – ScottR

+0

我實際上不希望程序「清理作業日誌」,這會隱藏實際問題。我知道存在問題,我無法在乾草堆中找到導致錯誤的程序。 – ScottR

0

下面是在作業日誌消息的一個例子,它在調用了主機變量名「原因」的聲明。在這個例子中,它是「TCANDSBMDT」。這有助於縮小它的範圍嗎?

Message ID . . . . . . : SQL0305            
Date sent . . . . . . : 08/06/12  Time sent . . . . . . : 10:41:52 

Message . . . . : Indicator variable required.        

Cause . . . . . : A FETCH, embedded SELECT, CALL, GET DESCRIPTOR, or a SET 
    or VALUES INTO statement has resulted in a null value, but an indicator  
    variable was not specified for host variable TCANDSBMDT. ... 
+0

正確 - 那個特定的消息沒有列出主機變量。問題是當100多個程序使用該變量名稱(這些不是世界上最好的編碼程序)。光標未打開等其他錯誤不會列出任何信息。 – ScottR

相關問題