ushidayの日記

主に「IBMi」のメモに・・・

db2_prepare & db2_executeの怪

PHPDB2のテーブルにSQLを投げる際に、代表的な関数が2つあります。

  • もう1つは
    1. db2結果 = db2_prepare(db2接続,SQL文字列)こちらは、SQL文に「?」でパラメータマーカを指定出来ます。次に...
    2. db2_execute(db2結果,[パラメータArray])

db2_exec」は1回のアクションで、結果を取るのに対して、「db2_prepra」はSQLを事前コンパイルし、DB2用に最適化後に、「db2_execute」でSQLを実際に投げるという最低2アクションがあります。(パラーメタArrayの代わりに、db2_bind_parmを使うことも出来ます。)

どちらかを使用用途に合った形で使えば良いのですが、「db2_prepra」方だけ、不思議な現象が起きるのです。

IBM i(AS/400)のDB2には文字列のデータ属性が幾つかあります。以下が代表的なモノです。

  • A:SBCSのみ
  • O:SBCS,DBCS混合
  • J:DBCSのみ(先頭桁にx'0E'と最終桁にx'0F'が強制的に挿入される)
  • G:DBCSのみ(x'0E'とx'0F'を扱わないDBCSフィールド)

この内”G”は、殆使う機会もないので、試してないのですが、”J”に関して言うと、「db2_prepra」だと、正しいSQLの結果が得られないのです。「db2_exec」だと問題なく結果が得られるのに...。:-(
そういう仕様なのか?不具合なのか?は、不明ですが、”J”フィールドを使われている方は、困るかもしれませんね。
自分は、強制的に入る、シフトイン・シフトアウトがどうも好きになれないので、あまり使う機会がないのですが。