我在IBM i上運行Apache,爲CGI調用設置爲使用嵌入式SQL的RPG ILE程序。查找導致作業日誌SQL錯誤的CGI RPG程序
我得到不同的SQL錯誤,在這些程序(例如「指示器變量所需」和「光標不開」),但我無法找到該節目特別是造成這些問題。在這個系統中有數百個程序,在錯誤消息中打F1並沒有指定源程序(消息來自/到'QSQRUN2')。
我不能在調試模式下重新編譯每一個程序,這可能會提供更多的信息(生產系統,有些源的問題)。
有關如何獲取此信息的任何想法?
我在IBM i上運行Apache,爲CGI調用設置爲使用嵌入式SQL的RPG ILE程序。查找導致作業日誌SQL錯誤的CGI RPG程序
我得到不同的SQL錯誤,在這些程序(例如「指示器變量所需」和「光標不開」),但我無法找到該節目特別是造成這些問題。在這個系統中有數百個程序,在錯誤消息中打F1並沒有指定源程序(消息來自/到'QSQRUN2')。
我不能在調試模式下重新編譯每一個程序,這可能會提供更多的信息(生產系統,有些源的問題)。
有關如何獲取此信息的任何想法?
@ user2338816在評論中給出了這個答案。
有一種簡單的方法可以爲特定的作業添加SQL監視。
STRDBMON OUTFILE(QGPL/DBMON) JOB(*ALL/QTMHHTTP/WEBSERVER) FTRSQLCODE(*NONZERO)
開始監視用戶QTMHHTTP,工作WEBSERVER所有作業(當前或未來),日誌記錄給予警告或錯誤的所有語句監視器。
上所產生的QGPL/DBMON數據庫文件的詳細信息,請參閱here。
然後,您可以交叉引用在作業日誌作業數/時間,如果你需要一些背景。
哪裏看到錯誤?
你說「打F1 ......」你的意思擊中作業日誌F10 =顯示信息;來自WRKACTJOB屏幕上的7 = Display消息?
如果是這樣,嘗試5 =工作,以及11 =顯示調用堆棧..
如果作業不是進入MSGW,那麼你的程序吞嚥錯誤。要麼不恰當地不做任何事情。或者在處理完問題後(而忽略清理作業日誌)或記錄你需要的地方的數據。你只需要找出在哪裏。
下面是在作業日誌消息的一個例子,它在調用了主機變量名「原因」的聲明。在這個例子中,它是「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. ...
正確 - 那個特定的消息沒有列出主機變量。問題是當100多個程序使用該變量名稱(這些不是世界上最好的編碼程序)。光標未打開等其他錯誤不會列出任何信息。 – ScottR
STRTRC與TRCTYP * DBSQL是否提供更多信息? – Dko
儘管您無法重新編譯調試,您能否將一個或多個服務器作業置於調試狀態(例如,通過STRSRVJOB)?或者針對一個或多個服務器作業啓動數據庫監視器(STRDBMON)以查看捕獲的內容。如果錯誤在過程內,則數據庫監視器應記錄過程名稱。任何調試或監視器只會暫時運行,以查看joblog或monitor數據庫是否記錄了有用的信息。 – user2338816
@ user2338816 STRDBMON正是我所需要的! 'STRDBMON OUTFILE(QGPL/DBMON)JOB(* ALL/QTMHHTTP/WEBSERVER)FTRSQLCODE(* ERROR)'將列出所有帶有錯誤的SQL語句,它們的文本以及它們來自哪個程序!如果你想回答,我會給你。 – ScottR