对于存储过程,MapSqlParameterSource无法使用NamedParameterJdbcTemplate正确映射

时间:2014-03-16 23:19:09

标签: java spring stored-procedures jdbctemplate

我正在尝试使用带有NamedParameterJdbcTemplate的映射参数调用存储过程(Spring 3.0),但由于某些奇怪的原因,某些值不会传递给存储过程(Oracle 11.2)!

有问题的存储过程的界面:

PROCEDURE my_stored_proc(
  h_id IN NUMBER,
  h_type IN VARCHAR2,
  h_status in varchar2  DEFAULT null,
  h_end_date IN DATE DEFAULT null,
  h_reason IN VARCHAR2 DEFAULT null,
  h_rating IN VARCHAR2 DEFAULT null,
  h_position IN VARCHAR2 DEFAULT null,
  h_rater_id IN VARCHAR2 DEFAULT null,
  h_start_date IN DATE DEFAULT null,
  h_rater IN VARCHAR2 DEFAULT null,
  h_supervisor IN VARCHAR2 DEFAULT null,
  h_grade IN VARCHAR2 DEFAULT null)

我只需要传递一小部分参数用于我的功能(不是全部):

String sql = "{call my_stored_proc(:h_id,:h_type,:h_reason,:h_position)}";

MapSqlParameterSource sqlParamMap = new MapSqlParameterSource();
sqlParamMap.addValue("h_id", myObj.getHId(), Types.NUMERIC);
sqlParamMap.addValue("h_type", myObj.getHType(), Types.VARCHAR);
sqlParamMap.addValue("h_reason", myObj.getHReason(), Types.VARCHAR);
sqlParamMap.addValue("h_position", myObj.getHPosition(), Types.VARCHAR);

NamedParameterJdbcTemplate template = new NamedParameterJdbcTemplate(ds);
template.execute(sql, sqlParamMap, new PreparedStatementCallback<Boolean> {

    @Override
    public Boolean doInPreparedStatement(PreparedStatement ps)
            throws SQLException, DataAccessException {
        return ps.execute();
    }
);

如您所见,我没有使用所有存储过程的参数 - 仅基于此特定功能所需和所需。尽管如此,当我让my_stored_proc()简单地将参数值写入表格时,即使在调试期间h_reasonh_positionmyObj.getHReason()myObj.getHPosition()也是空的两者都有适当的价值。

如果我通过SQL中的以下匿名块执行存储过程:

DECLARE
  h_id NUMBER;
  h_type VARCHAR2(200);
  h_reason VARCHAR2(200);
  h_position VARCHAR2(200);
begin
  h_id := 12352;
  h_type := 'Z';
  h_reason := 'L';
  h_position := 'P';

my_stored_proc(
    h_id => h_id,
    h_type => h_type,
    h_reason => h_reason,
    h_position => h_position
  );
END;

存储过程会插入一组正确的值,因此存储过程不是故障。即使并非所有参数都被使用,我是否需要指定所有参数?

1 个答案:

答案 0 :(得分:2)

根据我的经验,MapSqlParameterSource遇到了很多问题,从那时起,我就转而使用Map<String, Object>来解决变量绑定问题。