在 informix 中捕获错误

Posted

技术标签:

【中文标题】在 informix 中捕获错误【英文标题】:Catch Error In informix 【发布时间】:2011-07-29 02:21:53 【问题描述】:

该程序使用 Informix 4GL。目的是删除报告。好吧实际上它运作良好,但问题是只有特定用户才能删除报告的物理文件,这意味着管理员。其他用户可以删除数据库中的报表,但不能删除物理路径。所以我需要在语法命令rm -f 中捕获错误。我尝试使用 WHENEVER ERROR 但它无法捕捉到它。有谁知道该怎么做?这是删除报告的代码:

 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                                                   

【问题讨论】:

正在讨论的语言是 Informix-4GL 或 I4GL(或者,在很多圈子里,只是 4GL,但这似乎总是很冒昧)。 【参考方案1】:

我认为您无法捕获完整的错误消息,除非您将 stdout/stderr 作为 rm 命令的一部分重定向到另一个文件。您可以使用 RUN 语句的 RETURNING 子句将 shell 命令的返回码返回到 4gl 程序,例如您可以在“RUN prt_command”之后添加以下内容:

RUN prt_comand RETURNING p_return_code

凭记忆,我相信您需要将返回码 MOD 256。

【讨论】:

使用 MOD 256 会给您子进程死于信号的编号,如果它实际上死于信号的话。您将除以 256 以获得退出状态。返回的数字是来自 wait() 系统调用的 16 位值。【参考方案2】:

这听起来像是经典的X-Y problem,真正的问题是最初生成的报告的访问权限。

也许报告文件在生成后应该是chmod-ed 以允许其他人删除它,或者应用程序用户应该有一个正确设置的umask

【讨论】:

【参考方案3】:

请注意,rm -f 即使删除文件失败或文件不存在也会返回成功。如果你想让rm返回错误,你不能告诉它不要返回错误。

否则,使用建议:

RUN prt_command RETURNING p_retcode

是正确的。如果p_retcode 的值不为零,则该命令以某种方式失败。


下面复制的那行是多余的:

LET prt_comand = prt_comand CLIPPED

如果prt_command 是一个 CHAR 变量,则存储的结果将再次以空白填充(所有 CHAR 变量都以空白填充存储到全长)。如果 prt_command 是 VARHR 变量,则先前使用 CLIPPED 的赋值已经删除了尾随空格。

我不清楚你为什么在rm 命令之前使用反斜杠。您是否避免使用别名?如果是这样,是时候摆脱rm 的别名了;从长远来看,这是致命的。学习正确使用 raw 命令。如果您使用没有别名的机器,您将不会受到保护,并且您将在没有别名声称提供的任何安全网的情况下滥用该命令。

【讨论】:

以上是关于在 informix 中捕获错误的主要内容,如果未能解决你的问题,请参考以下文章

informix数据库错误码-268与-239有啥不同

为啥“WITH”子句在 Informix 上会出现语法错误?

Informix 错误:发生了语法错误。错误代码:-201

informix 锁表问题

插入记录时出现 Informix“没有这样的 DBspace”错误

Informix CDC API 错误