java怎样接受oracle数据库的存储过程所返回的Table类型数据和array?

我用OracleTypes.ARRAY和OracleTypes.CURSOR和oracle.jdbc.OracleTypes.PLSQL_INDEX_TABLE都不行。
用oracle.jdbc.OracleTypes.PLSQL_INDEX_TABLE提示索引中丢失 IN 或 OUT 参数:: 1

给你段代码参考,绝对可以:
使用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;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-01-13
OracleTypes.CURSOR是可行的
我们的实例:
给你个解析的代码看下吧
CallableStatement proc
SqlParam public String param_name;
public int param_type;
public String param_value

// 将输出结果放入List中
if (out_params != null) {
int oIndex = in_params.size();
for (int k = 1; k <= out_params.size(); k++) {
SqlParam param = (SqlParam) out_params.get(k - 1);
int type = param.getParam_type();

switch (type) {
case OracleTypes.VARCHAR:
String value = (String) proc.getString(oIndex + k);
oList.add(value);
break;
case OracleTypes.CURSOR:
rs = (ResultSet) proc.getObject(oIndex + k);
list = RSUtil.getStrsList(rs);
oList.add(list);
break;
default:
throw new RuntimeException(
"###: SqlParam参数异常,目前只支持String,number两大类数据类型");
}
}
}
第2个回答  2011-01-12
create table T_TABLE
(
ID NUMBER(10) not null primary key,
RQ VARCHAR2(50)
)

CREATE OR REPLACE Procedure p_add (IId Number)
Is
srq Varchar2(50);
Begin
Select rq Into srq From t_table Where Id=iid;
If srq Is Null Then
Update t_table Set rq=to_char(Sysdate,'yyyy-mm-dd') Where Id=iid;
Else
Update t_table Set rq=rq||';'||to_char(Sysdate,'yyyy-mm-dd') Where Id=iid;
End If;
Commit;
End;
--调用过程
Begin
p_add (1);
End;

以上,希望对你有所帮助!本回答被提问者采纳
相似回答