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