タイガー!タイガー!じれったいぞー!(SE編)

AS400, Java, JavaEE, JSF等の開発、習慣など。日々の気づきをまとめたブログ(備忘録)

【DB2 for i】「A5:SQL Mk-2」のSQLパラメータで数値を使いたい

久しぶりに、DB2 for i ネタになります。

A5:SQL Mk-2とは?

最高のSQLクライアントツールに、「A5:SQL Mk-2」というものがございます。

a5m2.mmatsubara.com

ODBCドライバーを経由して、DB2 for iの操作も可能!

ホント、軽量でして、毎日愛用させていただいているのですが、ひとつだけずっと未解決だったことがありました。

それが、「数値のバインド変数を使いたい」だったのです!

DDSで定義したテーブルの数値情報

DB2 for i」で、DDS(Data Description Specifications)を使用して物理テーブルを作成した場合、

数値項目を「ゾーン10進データ」で定義していると、DDLでは「NUMERIC」 に、

「パック10進データ」は「DECIMAL」の型になっていました。

SQLパラメータを使う

バインド変数とは、SQL文へ値を渡すことができる変数。

「A5:SQL Mk-2」の機能では、SQLパラメータというGUIで、変数を設定することができるのですが、DDS定義のテーブルに対して、数値をパラメータを渡そうとすると、「型の名前が無効です」というエラーが返ってきてしまうのです。

ちなみに、すべてのデータ型(16ビット整数、金額型など)を試しましたが、すべてエラーになってしまいます。

強引なアイディア

こうなったら、もうアイディア勝負でいきましょう。

「数値パラメータをいったん文字列で受け渡し、SQL文で数値変換することで正常に検索できないか?」と考えました。

すると!

下記のようなSQL文で、無事に実行できるようになりました。

select * 
  from TESTLIB.TABLE1
 where ID1 = @param1 and ID2 = CAST(@param2 AS Integer);

select * 
  from TESTLIB.TABLE2
 where ID1 = @param1 and ID2 = CAST(@param2 AS Integer);

select * 
  from TESTLIB.TABLE3
 where ID1 = @param1 and ID2 = CAST(@param2 AS Integer);

オッケーでございます!!!

文字列のバインド変数を、単純にIntegerにCASTすることで、SELECT文はエラーなく実行できましたよ。

A5:SQL Mk-2の疑似変数

さらに便利なのは、「A5:SQL Mk-2」の疑似変数という機能。

エディタ欄で、SetParameter変数を定義してあげれば、SQLパラメータWindowを呼び出すことなく、簡単に変数の値を設定できるようになりました!

a5m2.mmatsubara.com

/**
 SetParameter param1 'ID2700' String
 SetParameter param2 '1'      String
*/

select * 
  from TESTLIB.TABLE1
 where ID1 = @param1 and ID2 = CAST(@param2 AS Integer);

select * 
  from TESTLIB.TABLE2
 where ID1 = @param1 and ID2 = CAST(@param2 AS Integer);

select * 
  from TESTLIB.TABLE3
 where ID1 = @param1 and ID2 = CAST(@param2 AS Integer);

まとめ

これで、テスト作業など、一気にはかどりそうですね。

小細工とはいえ、やりたいことが実現できればそれでいいのです。

目的と手段を履き違えることなく、前に進んでいきたいと思っています。