首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用DBD::Informix捕获错误

使用DBD::Informix捕获错误
EN

Stack Overflow用户
提问于 2011-08-17 04:35:26
回答 3查看 674关注 0票数 1

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

代码语言:javascript
复制
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可以预见地抛出被零除的错误,但错误消息没有多大帮助:

代码语言:javascript
复制
DBD::Informix::st fetchrow_arrayref failed:
SQL: -1202: An attempt was made to divide by zero.

在这种情况下,最好在计算失败时返回NULL。除了解析投影子句并包含每个除法尝试以防万一之外,还有什么方法可以实现这一点吗?结束?我更喜欢使用一些DBD::Informix魔术,如果它存在的话。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-17 05:33:06

我不相信您能够使用DBD::Informix或任何其他数据库客户端来解决这个问题,而不是解析和重写SQL。没有使用/0算法忽略列的选项:当在引擎级遇到错误时,整个语句都会失败。

如果有任何帮助,你可以编写代码来避免将/0作为DECODE而不是CASE ... END,后者更简洁,例如:

代码语言:javascript
复制
DECODE(table.MAXSTAFFED, 0, NULL,
  ((table.MAX_TOT_PERCENTS/100)/table.MAXSTAFFED)))/(table.INTRVL*60)))
票数 2
EN

Stack Overflow用户

发布于 2011-08-18 00:45:53

Informix是一个到Informix DBMS的接口,并且尽可能地瘦(虽然不像我希望的那样薄,但这是另一回事了)。DBD::Informix (或访问DBMS的任何其他DBD驱动程序)无法合理地协调这种行为;它必须由DBMS本身处理。

IDS不提供生成NULL而不是除以零错误的机制。这可能是一个合理的特性请求--但它最早也要等到Informix11.70的后续版本才能实现。

请注意,Informix Dynamic Server (IDS) 9.x已超过其支持的生命周期的最后几年(10.00也不受支持)。

票数 1
EN

Stack Overflow用户

发布于 2011-08-17 04:41:32

从使用informix的经验来看,我认为能够在IDS中获得这种功能将是您的幸运( IDS的早期版本--比您的版本早不了多少--几乎没有任何字符串操作函数,更不用说任何复杂的功能了。)

我会节省时间,并根据内存中的列表生成计算。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7084675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档