[Seasar-user:3197] Re: S2Dao からストアドプロシージャの実行

上原 慶三 keizou
2006年 2月 16日 (木) 05:34:51 JST


 上原です。

 tarumiさんのパッチを参考にさせていただいて、
subversionにコミットしてみました。

 PostgreSQLで試験してみたのですが、PostgreSQLだと
2つ以上のOUTパラメータが指定された場合、1つのレコード型
パラメータとして処理されるようで、うまくいきませんでした。
すいませんが、Oracleで試してみてもらえないでしょうか。

2つ以上のOUTパラメータが必要な場合は、帰り値がMapでなければなりません。

#ドキュメントとかテストとか書こうと思ったけどもうだめだ。

tarumi wrote:
> tarumiです。
> 
> OracleでProcedure,Function,Packageを動かせるよう
> BasicProcedureHandler.javaをちょっといじってみました。
> とりあえずOracleの動作確認しかしていませんが
> 一応動きます。
> ただし、スキーマ.ProcedureとPackage.Procedureの
> 区別がつかない為、現在はPackage.Procedureを優先しています。
> また、InOutパラメータに関しての対応がありません。
> 
> 
> ・BasicProcedureHandler.java
> 変数追加
> private List<Integer> columnInOutTypes_;
> 
> initTypesメソッド内
>   columnInOutTypes_ = new ArrayList<Integer>();
>>>> // パッケージ対応
> //   rs = dmd.getProcedureColumns(null,null,procedureName_,null);
>    String[] names = procedureName_.split("\\.");
>    int namesLength = names.length;
>    if(namesLength == 1)
>     rs = dmd.getProcedureColumns(null,null,procedureName_,null);
>    else if(namesLength == 2)
>     rs = dmd.getProcedureColumns(names[0],null,names[1],null);
>    else if(namesLength == 3)
>     rs = dmd.getProcedureColumns(names[1],names[0],names[2],null);
>>>>    while(rs.next()){
>     int columnType = rs.getInt(5);
> // Outパラメータ対応
> //     if(false || columnType == DatabaseMetaData.procedureColumnReturn ||
> //       columnType == DatabaseMetaData.procedureColumnOut
> //       ){
> //     if(returnColumnNum_>0){
> //      throw new SRuntimeException("EDAO0010");
> //     }
> //     returnColumnNum_ = pos;
> //     buff.setLength(0);
> //     buff.append("{? = call ");
> //     buff.append(procedureName_);
> //     buff.append("(");
>     columnInOutTypes_.add(new Integer(columnType)); // bindArgs,executeパラ
> メータのINOUT参照用で使用
>     if(columnType == DatabaseMetaData.procedureColumnIn){
>      buff.append("?,");
>     }else if(columnType == DatabaseMetaData.procedureColumnReturn){
>      buff.setLength(0);
>      buff.append("{? = call ");
>      buff.append(procedureName_);
>      buff.append("(");
>     }else if(columnType == DatabaseMetaData.procedureColumnOut){
>      buff.append("?,");
>     }else{
>      throw new SRuntimeException("EDAO0010",new Object[]{procedureName_});
>     }
>     dataType.add(rs.getObject(6));
>     pos++;
>    }
> bindArgsメソッド内
> // Outパラメータ対応
> //  for (int i = 0; i < columnTypes_.length;i++) {
> //   if(returnColumnNum_ == i + 1){
> //    ps.registerOutParameter(i+1,columnTypes_[i].intValue());
> //   }else{
> //    ps.setObject(i+1,args[argPos++],columnTypes_[i].intValue());
> //   }
> //  }
>   for (int i = 0; i < columnTypes_.length;i++) {
>    if(columnInOutTypes_.get(i).intValue() ==
> DatabaseMetaData.procedureColumnIn)
>     ps.setObject(i+1,args[argPos++],columnTypes_[i].intValue());
>    else if(columnInOutTypes_.get(i).intValue() ==
> DatabaseMetaData.procedureColumnOut){
>     ps.registerOutParameter(i+1,columnTypes_[i].intValue());
>     argPos++;
>    }
>    else if(columnInOutTypes_.get(i).intValue() ==
> DatabaseMetaData.procedureColumnReturn){
>     ps.registerOutParameter(i+1,columnTypes_[i].intValue());
>    }
>   }
> executeメソッド内
> // Outパラメータ複数対応
> //   return (returnColumnNum_>0)?cs.getObject(returnColumnNum_):null;
>    List<Object> list = new ArrayList<Object>();
>    int outPos = 1;
>    for (Integer integer : columnInOutTypes_) {
>     if(integer.intValue() == DatabaseMetaData.procedureColumnReturn
>      || integer.intValue() == DatabaseMetaData.procedureColumnOut){
>      list.add(cs.getObject(outPos));
>     }
>     outPos++;
>    }
>    if(list.size() == 0) return null;
>    if(list.size() == 1) return list.get(0);
>    return list;
> 
> 以上です。
> 
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> http://lists.sourceforge.jp/mailman/listinfo/seasar-user
> 


-- 
---
上原 慶三<[E-MAIL ADDRESS DELETED]>



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