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 展开
用oracle.jdbc.OracleTypes.PLSQL_INDEX_TABLE提示索引中丢失 IN 或 OUT 参数:: 1 展开
3个回答
展开全部
给你段代码参考,绝对可以:
使用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;
}
使用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;
}
展开全部
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两大类数据类型");
}
}
}
我们的实例:
给你个解析的代码看下吧
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两大类数据类型");
}
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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;
以上,希望对你有所帮助!
(
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;
以上,希望对你有所帮助!
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询