这是我试图调用的Oracle过程:
PROCEDURE GetCoreReportExtras
( pnAssignment IN NUMBER,
pnUserRole in NUMBER,
psAreaMenu in VARCHAR2,
pnAreaLevel in NUMBER,
curReportList OUT outcur,
psLDO in VARCHAR2 default 'none',
pnAcisNumber in NUMBER default 0);以下是我的Java代码:
private class GetStandardReportExtrasSPV2{
int nAreaLevel;
int nAssignment;
int nUserRole;
int nAcisNum = 0;
String strAreaMenu;
String strLDO = null;
private SimpleJdbcTemplate simpleJdbcTemplate;
private SimpleJdbcCall procGetReportExtras;
public GetStandardReportExtrasSPV2(DataSource ds, int nUserRole, String strAreaMenu,
int nAssignment, int nAreaLevel, String strLDO, int nAcisNum) {
this.simpleJdbcTemplate = new SimpleJdbcTemplate(ds);
JdbcTemplate jdbcTemplate = new JdbcTemplate(ds);
jdbcTemplate.setResultsMapCaseInsensitive(true);
this.procGetReportExtras =
new SimpleJdbcCall(jdbcTemplate)
.withCatalogName("package")
.withProcedureName("proc")
.returningResultSet(REPORT_LIST,
ParameterizedBeanPropertyRowMapper.newInstance(Report.class));
}
public List<Report> getReportsList() {
Map<String, Object> params = new HashMap<String, Object>();
params.put(USER_ASSIGNMENT, nAssignment);
params.put(USER_ROLE, nUserRole);
params.put(AREA_MENU, strAreaMenu);
params.put(AREA_LEVEL, nAreaLevel);
params.put(SEGMENT, strLDO);
params.put(ACIS_NUMBER, nAcisNum);
SqlParameterSource in = new MapSqlParameterSource()
.addValues(params);
Map m = procGetReportExtras.execute(new HashMap<String, Object>(0), in);
return (List) m.get(REPORT_LIST);
}
}当getReportsList()调用execute()时,我得到以下异常:
org.springframework.jdbc.core.metadata.CallMetaDataContext.matchInParameterValuesWithCallParameters(CallMetaDataContext.java:555) org.springframework.jdbc.core.simple.AbstractJdbcCall.matchInParameterValuesWithCallParameters(AbstractJdbcCall.java:419) org.springframework.jdbc.core.simple.AbstractJdbcCall.doExecute(AbstractJdbcCall.java:364) org.springframework.jdbc.core.simple.SimpleJdbcCall.execute(SimpleJdbcCall.java:173) 2 java.lang.ArrayIndexOutOfBoundsException
对我做错了什么有什么暗示吗?
发布于 2013-08-30 17:57:42
问题就在这里
Map m = procGetReportExtras.execute(new HashMap<String, Object>(0), in);您正在调用接受一个过载的Object ...方法。这种方法
包含调用中使用的in参数值的可选数组。参数值的提供必须与为存储过程定义参数的顺序相同。
在您的调用中,这两个参数恰好是一个空HashMap和一个SqlParameterSource。
调用在CallMetaDataContext#matchInParameterValuesWithCallParameters()中失败。来源:
public Map<String, ?> matchInParameterValuesWithCallParameters(Object[] parameterValues) {
Map<String, Object> matchedParameters = new HashMap<String, Object>(parameterValues.length);
int i = 0;
for (SqlParameter parameter : this.callParameters) {
if (parameter.isInputValueProvided()) {
String parameterName = parameter.getName();
matchedParameters.put(parameterName, parameterValues[i++]); // fails here
}
}
return matchedParameters;
}它期望传递的数组包含7个元素(因为这正是存储过程所期望的),但它只有2个元素,即HashMap和SqlParameterSource。当它尝试访问第三个(索引2)时,它会抛出一个ArrayIndexOutOfBoundsException。
您可能想使用SqlParameterSource
Map m = procGetReportExtras.execute(in);发布于 2013-08-30 17:54:37
您调用错误的SimpleJDBCCall.execute(Object... args);使用SimpleJDBCCall.execute(SqlParameterSource)
procGetReportExtras.execute(in);https://stackoverflow.com/questions/18537576
复制相似问题