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

我用OracleTypes.ARRAY和OracleTypes.CURSOR和oracle.jdbc.OracleTypes.PLSQL_INDEX_TABLE都不行。用... 我用OracleTypes.ARRAY和OracleTypes.CURSOR和oracle.jdbc.OracleTypes.PLSQL_INDEX_TABLE都不行。
用oracle.jdbc.OracleTypes.PLSQL_INDEX_TABLE提示索引中丢失 IN 或 OUT 参数:: 1
展开
 我来答
crazylaa
2011-01-11 · TA获得超过234个赞
知道小有建树答主
回答量:287
采纳率:0%
帮助的人:294万
展开全部
给你段代码参考,绝对可以:
使用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;
}
zfg152543
2011-01-13 · 超过16用户采纳过TA的回答
知道答主
回答量:50
采纳率:0%
帮助的人:46.6万
展开全部
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两大类数据类型");
}
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
梵天弘业T2
2011-01-12 · TA获得超过2140个赞
知道小有建树答主
回答量:1305
采纳率:0%
帮助的人:983万
展开全部
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;

以上,希望对你有所帮助!
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式