きどたかのブログ

いつか誰かがこのブログからトラブルを解決しますように。

SQLJの壁を1つ乗り越えた(sqlj.runtime.Scrollable)

sqlj.runtime.Scrollableなイテレータ宣言の仕方。
DB2のマニュアルを信じていたのに、マニュアルではない書き方が必要。


sqljエディターの右クリックのコンテキストメニューより「SQLJアシスト」を使う。
まずこの時点でRational Appilcation Developerでも入ってないと厳しい。


#sql public iterator TestItr implements sqlj.runtime.Scrollable with (holdability=true,sensitivity=sqlj.runtime.ResultSetIterator.SENSITIVE, dynamic=true) (String COLUMN_A);


DB2のマニュアル通りにsensitivity=SENSITIVEと書いていては動かない。
また、この書き方をするようになって、イテレータ属性の中のdynamic指定がSQLJ仕様にないと言われることはなくなった。


SQLJアシストからのウィザードに従う中で、「ユーザーインターフェース」を追加することも可能だが意味がない。
#sql public iterator TestItr implements sqlj.runtime.Scrollable,UserInterface with (holdability=true,sensitivity=sqlj.runtime.ResultSetIterator.SENSITIVE, dynamic=true) (String COLUMN_A);
つまりは複数のインタフェースを書けるのだが、Javaソースは自動生成なので未実装で怒られることうけあい。
これでユーザーインタフェースを追加する場合は、以降は自動生成に頼らないのが前提だと思う。


ちなみにこの記述はNamedIteratorでもある。
末尾に(String COLUMN_A)と書いてる部分でそのように認識される。
これはTestItr型な変数itがあるとして、
String a = it.COLUMN_A();
と書けるようになる。
it.getResultSet()したものを引きまわす場合は、NamedIteratorにする意味は無いと言って良い。


ちなみにsqlj.runtime.NamedIteratorはマーカーインターフェースです。
(String COLUMN_A)のCOLUMN_Aは、TestItrクラスにCOLUMN_Aアクセサーを作れという内容に変わる。


さきほど「ユーザーインタフェース」の話を書いていたが、implementsではなくextendsを書けないのは理由がある。
sqljの自動生成の裏側でextendsを使ったコードを生成するからだ。


あと、これまで以下が受け付けられなかったのは、intとして指定されることだからなのであろう。
#sql public iterator TestItr implements sqlj.runtime.Scrollable with (sensitivity=SENSITIVE) (String COLUMN_A);
sensitivityはintなので、文字列が来たら解釈出来んってわけ。
#sql public iterator TestItr implements sqlj.runtime.Scrollable with (sensitivity=1) (String COLUMN_A);
のようにintベタ打ちであれば解釈されたが、自分が作ったint定数を入れると受け付けてくれない。
なんだか色々不思議な制御がされているということだな。



また、やはり明らかにsensitivity指定しないデフォルト値がINSENSITIVEというマニュアルの記述は誤りで、
sqlj.runtime.ResultSetIerator.ASENSITIVE(=1)が返ってきていて、ResultSet的にはTYPE_FORWARD_ONLYとして扱われる。