使用DBD :: Informix捕获错误

时间:2011-08-16 20:35:26

标签: perl informix dbi

我需要针对Informix IDS 9.x运行动态构造的查询;而WHERE子句大多非常简单,Projection子句可能非常复杂,有很多列和公式应用于列。这是一个例子:

SELECT ((((table.I_ACDTIME + table.I_ACWTIME + table.I_DA_ACDTIME + table.I_DA_ACWTIME +
           table.I_RINGTIME))+(table.I_ACDOTHERTIME + table.I_ACDAUXINTIME + 
           table.I_ACDAUX_OUTTIME)+(table.I_TAUXTIME + table.I_TAVAILTIME + 
           table.I_TOTHERTIME)+((table.I_AVAILTIME + table.I_AUXTIME)*
         ((table.MAX_TOT_PERCENTS/100)/table.MAXSTAFFED)))/(table.INTRVL*60))
FROM table
WHERE ...

当使用的某些字段包含零时,会出现问题; Informix可预测地抛出除零错误,但错误消息不是很有帮助:

DBD::Informix::st fetchrow_arrayref failed:
SQL: -1202: An attempt was made to divide by zero.

在这种情况下,希望在计算失败时返回NULL。除了解析Projection子句以及在CASE ... END中包含每个分区尝试之外,有没有办法实现这个目的?如果它存在的话,我宁愿使用一些DBD :: Informix魔法。

3 个答案:

答案 0 :(得分:2)

我不相信你能用DBD :: Informix或任何其他数据库客户端来解决这个问题,而不需要解析SQL并重写它。没有选择只使用/ 0算法忽略该列:在发动机级别遇到错误时整个语句失败。

如果有任何帮助,你可以编写代码以避免/ 0为DECODE而不是CASE ... END,这有点清洁,即:

DECODE(table.MAXSTAFFED, 0, NULL,
  ((table.MAX_TOT_PERCENTS/100)/table.MAXSTAFFED)))/(table.INTRVL*60)))

答案 1 :(得分:1)

DBD :: Informix是Informix DBMS的一个接口,尽可能地薄(这不是我想要的那么薄,但这是另一个讨论)。这种行为不能合理地由DBD :: Informix(或访问DBMS的任何其他DBD驱动程序)调解;它必须由DBMS本身处理。

IDS不提供产生NULL的机制来代替除以零的错误。这可能是一个合理的功能请求 - 但它最早要在Informix 11.70的后续版本之前实现。

请注意,Informix Dynamic Server(IDS)9.x比其支持生命周期结束还要好几年(10.00也不受支持)。

答案 2 :(得分:0)

根据使用informix的经验,我会说你很幸运能在IDS中获得那种功能(IDS的早期版本 - 比你的版本早得多 - 几乎没有任何字符串操作功能,也没有任何复杂的东西。)

我会节省时间并针对内存列表生成计算。