[Seasar-user:1690] Re: S2DAO ERROR

s-fukuzawa@hitachijoho.com s-fukuzawa
2005年 3月 28日 (月) 12:11:12 JST


福澤です。

> ------------------------------
> select TOP
> /*IF dto.max != null*/ /*dto.max*/ /*END*/
> * from tmp_shi_InterChg
> where
> /*IF dto.searchPn != null*/FindPartNo LIKE /*dto.searchPn*//*END*/ 
> /*IF dto.level == 0*/and AuthStatus > ' ' /* *//*END*/ order by
> FindPartNo, FindMfr
> 
> --------------------
> 
> この2行目を 数字の20でしたら問題ないのですが、
> 
> /*IF dto.max != null*/ /*dto.max*/ /*END*/
> にすると下記 ERRORが発生してしまいます。

TOP句に対して、プレースホルダを利用して値を動的にバインドできない、というのが原因だと思います。
上の例だと、dto.max != nullならばSQLステートメントは、
select TOP ? * from tmp_shi_InterChg ...
と一旦構築されて、?の部分をバインドしようとしますが、出来ないと。
select文中ではwhere句内でないとプレースホルダは使えない……んですかね?
詳しいことはよく知りませんが。


バッドノウハウ的ですが、dto.maxの取りうる値が限られているのであれば、
以下のように書けば、一応動的にTOPの値を変えられます。

select TOP
/*IF dto.max == 20*/ 20 /*END*/
/*IF dto.max == 30*/ 30 /*END*/
...
* from tmp_shi_InterChg

こうすれば、SQLステートメントは、dto.max == 20 のとき
select TOP 20 * from tmp_shi_InterChg ...
と構築されるはずなので、問題は発生しないです(多分)。

この技、TOP句では使ったことないですが、order by 句を動的に変えたいとき利用してます。

-----------------------
福澤 進
[E-MAIL ADDRESS DELETED]



Seasar-user メーリングリストの案内