给你段代码参考,绝对可以:
使用cs.registerOutParameter(2, OracleTypes.STRUCT, DBI.TYPE.T_SMS_TASK);
OracleTypes.STRUCT,表示自定义的table类型, DBI.TYPE.T_SMS_TASK这个是你在oracle里面创建的类型。
我这里相当于返回了一个 自定义的type的index by 表。
public static SMSTaskObj selectSmsTask(int terminateTime) {
ICallableStatement cs = null;
SMSTaskObj taskObj = null;
try {
cs = DbFactory.getInstance().getCallableStatement(
DBI.SERVER_DB_NAME, PROC_SEL_SMS_TASK);
cs.setInt(1, terminateTime);
cs.registerOutParameter(2, OracleTypes.STRUCT, DBI.TYPE.T_SMS_TASK);
cs.registerOutParameter(3, OracleTypes.INTEGER);
cs.execute();
int retVal = cs.getInt(3);
if (retVal != 0) {
throw new Exception("Oracle procedure PROC_SEL_SMS_TASK error!");
}
STRUCT struct = (STRUCT) cs.getObject(2);
Datum[] dt = struct.getOracleAttributes();
if (String.valueOf(dt[0].bigDecimalValue()).equals("-1")) {
return null;
}
taskObj = new SMSTaskObj();
taskObj.setTaskId(String.valueOf(dt[0].bigDecimalValue()));
taskObj.setTempId(String.valueOf(dt[1].bigDecimalValue()));
taskObj.setUserGroupId(String.valueOf(dt[2].bigDecimalValue()));
taskObj.setUserId(String.valueOf(dt[3].bigDecimalValue()));
taskObj.setTempContent(dt[4].toString());
taskObj.setParamAmount(dt[5].intValue());
taskObj.setPriorityLevel(String.valueOf(dt[6].intValue()));
} catch (Exception ex) {
log.error(ex);
} finally {
try {
if (cs != null)
cs.close();
} catch (SQLException sqle) {
log.error(sqle);
}
}
return taskObj;
}