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

tarumi yuutarumi
2006年 2月 15日 (水) 12:54:19 JST


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