[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 メーリングリストの案内