2011-07-29 91 views
1

該程序使用Informix 4GL。目的是刪除報告。實際上它運行良好,但問題是隻有特定的用戶才能刪除報告的物理文件,這意味着管理員。其他用戶可以刪除數據庫中的報告,但不能刪除物理路徑。所以我需要捕捉語法命令rm -f中的錯誤。我試圖使用WHENEVER ERROR,但它無法捕捉它。有誰知道該怎麼做?這是刪除報表代碼:Catch Error In informix

DELETE FROM sysrpt 
WHERE srpt_seq_no = p_sysrpt.srpt_seq_no   
LET sel_rpt_id = ""  
LET sel_rpt_id = p_sysrpt.srpt_pgm_id CLIPPED, ".", 
        p_sysrpt.srpt_seq_no USING "<<<<<<" 
LET sel_rpt_id = sel_rpt_id CLIPPED  
LET prt_comand = "\\rm -f ", rpt_path CLIPPED, sel_rpt_id CLIPPED 
LET prt_comand = prt_comand CLIPPED        
RUN prt_comand             
+0

正在討論的語言是Informix-4GL或I4GL(或者在太多的圈子中,只是4GL,但總是顯得太冒昧)。 –

回答

1

我不認爲你可以,除非你將stdout /標準錯誤到另一個文件rm命令的一部分,以獲取完整的錯誤消息。您可以使用RUN語句的RETURNING子句將返回代碼從shell命令返回到4gl程序中,例如,你可以在「RUN prt_command」後添加以下內容:

RUN prt_comand RETURNING p_return_code 

從內存中,我相信你需要MOD 256返回碼。

+0

使用MOD 256會給你的子進程死亡的信號編號,如果它實際上是一個信號死亡。你會除以256以獲得退出狀態。返回的數字是來自'wait()'系統調用的16位值。 –

0

請注意,rm -f即使無法刪除文件或該文件不存在,也會返回成功。如果你想rm返回一個錯誤,你不能告訴它不要返回一個錯誤。

否則,建議使用:

RUN prt_command RETURNING p_retcode 

是正確的。如果p_retcode的值不爲零,則該命令以某種方式失敗。


下面複製的線是多餘:

LET prt_comand = prt_comand CLIPPED 

如果prt_command是CHAR變量,則所存儲的結果是填充空白試(所有CHAR變量存儲填充空白以全長) 。如果prt_command是VARCHR變量,則先前使用CLIPPED進行的分配已經刪除了尾隨空白。

我不清楚你爲什麼在rm命令之前使用反斜槓。你是否在避免別名?如果是這樣,那麼可以去掉rm的別名;從長遠來看,這是致命的。學會正確使用原始命令。如果你曾經到過一臺沒有別名的機器,你將不會受到保護,並且你會濫用這個命令,而沒有任何別名聲稱提供的安全網絡。

1

這聽起來像一個經典的X-Y problem,其中真正的問題是原始生成報告的訪問權限。

也許報告文件應該是chmod - 一代之後允許其他人刪除它,或者應用程序用戶應該有一個正確設置umask