久しぶりに、DB2 for i ネタになります。
A5:SQL Mk-2とは?
最高のSQLクライアントツールに、「A5:SQL Mk-2」というものがございます。
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を呼び出すことなく、簡単に変数の値を設定できるようになりました!
/** 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);
まとめ
これで、テスト作業など、一気にはかどりそうですね。
小細工とはいえ、やりたいことが実現できればそれでいいのです。
目的と手段を履き違えることなく、前に進んでいきたいと思っています。