我在Oracle中有一个过程,该过程具有12个总参数和3个可选参数.如果我在Spring 3.1.0中使用StoredProcedure对象,该如何考虑这些可选参数?
这是我到目前为止在StoredProcedure类中拥有的内容
public Map<String, Object> execute(Evaluation evaluation) {
Map<String, Object> input_params = new HashMap<String, Object>();
input_params.put(COURSE_MAIN_PK1_INPUT_PARAM, evaluation.getCourseId());
input_params.put(USERS_PK1_INPUT_PARAM, evaluation.getUsersPk1());
input_params.put(ACCREDITATION_PK1_INPUT_PARAM, evaluation.getAccreditationPk1());
input_params.put(TYPE_PK1_INPUT_PARAM, evaluation.getTypePk1());
input_params.put(PRIVACY_TYPE_PK1_INPUT_PARAM, evaluation.getPrivacyTypePk1());
input_params.put(FORM_TYPE_PK1_INPUT_PARAM, evaluation.getFormTypePk1());
input_params.put(TITLE_INPUT_PARAM, evaluation.getTitle());
input_params.put(DESCRIPTION_INPUT_PARAM, evaluation.getDescription());
if(evaluation.getStartDate() != null) {
input_params.put(START_DATE_INPUT_PARAM, new java.sql.Date(evaluation.getStartDate().getMillis()));
}
if(evaluation.getEndDate() != null) {
input_params.put(END_DATE_INPUT_PARAM, new java.sql.Date(evaluation.getEndDate().getMillis()));
}
input_params.put(SAVE_TO_GRADECENTER_INPUT_PARAM, evaluation.getGradeCenterColumn());
input_params.put(CREATE_ANNOUNCEMENT_INPUT_PARAM, evaluation.getAnnouncement());
return super.execute(input_params);
}
问题是我提供了12个参数,并且如果开始日期和结束日期为空,那么现在我提供了10个参数并出现异常.
数据库中日期的默认值是null.
解决方法:
JDBC的PreparedStatement
提供了一种使用setNull方法将空值设置为参数的功能.因此,只要将所有参数传递给存储过程(如果它们为null),Spring就能准备并执行该语句.
因此,您需要将值为null的输入参数添加到发送到存储过程调用的Map中.
input_params.put(START_DATE_INPUT_PARAM,
(null != evaluation.getStartDate()
? new java.sql.Date(evaluation.getStartDate().getMillis())
: null));
END_DATE_INPUT_PARAM同样适用.