Перехват ошибок с помощью DBD :: Informix - PullRequest
1 голос
/ 17 августа 2011

Мне нужно запускать динамически создаваемые запросы к 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 ]

2 голосов
/ 17 августа 2011

Я не верю, что вы сможете решить эту проблему с помощью DBD :: Informix или любого другого клиента базы данных, не прибегая к разбору SQL и его переписыванию.Нет возможности просто игнорировать столбец с арифметикой / 0: весь оператор завершается ошибкой при обнаружении ошибки на уровне механизма.

Если это поможет, вы можете написать код, чтобы избежать / 0 какDECODE, а не CASE ... END, что немного чище, то есть:

DECODE(table.MAXSTAFFED, 0, NULL,
  ((table.MAX_TOT_PERCENTS/100)/table.MAXSTAFFED)))/(table.INTRVL*60)))
1 голос
/ 17 августа 2011

DBD :: Informix - это интерфейс к СУБД Informix, и он настолько тонкий, насколько это возможно (что далеко не так тонко, как хотелось бы, но это другое обсуждение).Такое поведение не может быть разумно опосредовано DBD :: Informix (или любым другим драйвером DBD, обращающимся к СУБД);он должен обрабатываться самой СУБД.

IDS не предоставляет механизм выдачи NULL вместо ошибки деления на ноль.Это может быть разумный запрос функциональности, но он не будет реализован до самой ранней версии Informix 11.70.

Обратите внимание, что Informix Dynamic Server (IDS) 9.x через несколько лет после его окончания.поддерживаемая жизнь (10.00 также не поддерживается).

0 голосов
/ 17 августа 2011

Из опыта работы с informix я бы сказал, что вам повезет получить такую ​​функциональность в IDS (в более ранних версиях IDS - не намного раньше, чем в вашей версии - едва ли была какая-либо функция манипуляции со строками, что-либо сложное).

Я бы сэкономил время и сгенерировал бы вычисления по списку в памяти.

...