[DAO-106] [seasar-s2dao-dev:316]ストアドへの型変換にメタデータではなくValueTypeを使用するプロシージャ実行をサポートしました。 Created: 2007-07-16  Updated: 2007-09-01  Resolved: 2007-09-01

Status: Resolved
Project: S2Dao
Component/s: None
Affects Version/s: 1.0.44
Fix Version/s: 1.0.47-RC1

Type: Improvement Priority: Major
Reporter: manhole Assignee: taedium
Resolution: Fixed Votes: 0
Labels: None


 Description   

[seasar-s2dao-dev:316] BLOB型を引数にもつストアドが動かない」で報告いただいたように、
一部のJDBCドライバでは(報告ではOracle)、
「BLOB型のパラメータに対してDBのメタデータがTypes.OTHERを返しているから」という理由です。



 Comments   
Comment by taedium [ 2007-09-01 ]

新規のPROCEDURE_CALLアノテーションを使用した場合に、DBのメタデータではなくValueTypeを使うようにしました。

Comment by taedium [ 2007-08-25 ]

b案で対応しましたが、不完全です。

もともと、やりたいことは「Javaの型 -> ValueTypeを使ってJDBCの型に変換」ということなのですが
現状の仕様ではJavaのクラスに型が明示的な形で登場するのはINパラメータ(メソッドの引数の型)のみなんですよね。
(OUTパラメータの型がわからない。)

ということで現状の仕様ままでは対応しきれないので、新しいストアド対応のSqlCommandを作成しようと思います。
(現状の仕様はそのまま残します。)
これはDTOのプロパティにIN、OUT、RETURN等のアノテーションを指定してDBのメタデータを使わずに
ストアドを実行するというものになります。DTOに特定のアノテーションがついているかどうかで
旧仕様のSqlCommandか新仕様のSqlCommandかを振り分けようと思っています。

Comment by taedium [ 2007-07-20 ]

aの案ですが、変換処理の統一を考えた場合、他のgetValueメソッドにあわせてこれが必要になるのかなと思います

getValue(CallableStatement cs, int parameterIndex)

setの方はおっしゃるとおりValueType#bindValueが使えますね。

Comment by manhole [ 2007-07-20 ]

いきなり割れましたね^^;

a案の方、書き間違えたことに気づきました。ValueTypeに追加するのは、

void registerOutParameter(CallableStatement cs, int index, Object value)

の1メソッドですね。
setObject(int parameterIndex, Object x, int targetSqlType)メソッドは、既存のValueType#bindValueを使えそうですから。

Comment by taedium [ 2007-07-19 ]

aに+1です。
ValueType#setObject()でValueType#bindValue()でしているのと同じような値の変換処理をした方が統一的だと思うからです。

Comment by higa [ 2007-07-19 ]

bに+1

Comment by manhole [ 2007-07-19 ]

ValueType経由での型を使用するには、現状のAPIを変更する必要がありそうなので相談させてください。

ストアドを実装する際に

  • CallableStatement#registerOutParameter(int parameterIndex, int sqlType)
  • PreparedStatement#setObject(int parameterIndex, Object x, int targetSqlType)

を行う必要があり、現状はメタデータから取得したsqlTypeを使用しているのですが、今度は引数の型からsqlTypeを取得することになります。

その実現手段として下記2案があるかと思うのですが、どうでしょうか?

  • (a) ValueTypeにregisterOutParameter(int parameterIndex, int sqlType)とsetObject(int parameterIndex, Object x, int targetSqlType)を追加する
  • (b) ValueTypeに int getSqlType() を追加する
Generated at Tue Apr 23 19:40:08 JST 2024 using Jira 9.15.0#9150000-sha1:9ead8528714127d8cfabf2446010d7e62c0a195c.