2011-08-16 7 views
1

Informix IDS 9.xに対して動的に構築されたクエリを実行する必要があります。 WHERE句はほとんど単純ですが、Projection句は、列に多くの列や数式を適用すると非常に複雑になります。 1つの例を示します。DBD :: Informixでエラーをキャッチ

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句を解析する以外にこれを達成する方法はありますか? DBD :: Informixの魔法を使うのが好きです。

答えて

2

私は、DBD :: Informixや他のデータベースクライアントでこれを解決することはできませんが、SQLの解析と書き換えに頼ることはできません。/0算術で列を無視するだけのオプションはありません。エンジンレベルでエラーが発生すると文全体が失敗します。

それは任意のヘルプだ場合、あなたはすなわち、少しクリーナーである、DECODEではなくCASE ... ENDとして/ 0を回避するためにコードを書くことができます。

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

私は同じと思うが、このように行く前に確認しなければならなかった。 DECODE()のチップをありがとう、私はあまりにもInformixに精通していないとこの機能について知りませんでした。 –

+0

Informixが 'NULLIF'をサポートしている場合、NULLIF(...、0)になります。 –

0

のInformixでの作業経験から、私はあなたがIDS内functionallityのようなものを取得する幸運にwoud言うでしょう(IDSの以前のバージョン - あまり早くあなたのバージョンよりは - ほとんど任意の文字列操作関数は、複雑な何も用事していた。)

私は時間を節約し、メモリリストに対して計算を生成します。

+0

そうではありません。私は変更できないレポートテンプレートから事前定義されたクエリを取得します。私ができる唯一のことは解析して置き換えることですが、私はそれが気に入らない、あまりにも信頼できません。 –

1

DBD :: Informixのは、InformixへのインターフェイスですDBMS、そして可能な限り薄い(これはどこでも私が望むほど薄いものではないが、それは別の議論である)。このような動作は、DBD :: Informix(またはDBMSにアクセスする他のDBDドライバ)によって合理的に仲介できません。それはDBMS自身によって処理されなければならない。

IDSは、ゼロ除算の代わりにNULLを生成するメカニズムを提供しません。これは合理的な機能要求かもしれませんが、Informix 11.70の後継バージョンまでは実装されません。

Informix Dynamic Server(IDS)9.xは、サポートされている寿命が終わってから数年(10.00もサポートされていません)です。

+0

OK DBD :: Informixの作者が魔法を言わないなら、何もありません。ありがとう。バージョンに関しては、それはひどく時代遅れだと知っていますが、アップグレードはこの場合問題ありません。さらに、ほとんどの場合、実際にはうまくいくので、可能であってもアップグレードするインセンティブはほとんどありません。 :) –

関連する問題