在 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 中捕获错误的主要内容,如果未能解决你的问题,请参考以下文章
为啥“WITH”子句在 Informix 上会出现语法错误?