gpt4 book ai didi

java - MapSqlParameterSource 未正确映射存储过程的 NamedParameterJdbcTemplate

转载 作者:行者123 更新时间:2023-11-30 09:10:39 27 4
gpt4 key购买 nike

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

相关存储过程的接口(interface):

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_position 也是空的myObj.getHReason()myObj.getHPosition() 都有正确的值。

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

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;

存储过程确实插入了一组正确的值,因此不是存储过程有问题。即使没有使用所有参数,我是否也需要指定所有参数?

最佳答案

根据我的经验,我在使用 MapSqlParameterSource 时遇到过很多问题从那以后,我改用了 Map<String, Object>解决变量绑定(bind)问题。

关于java - MapSqlParameterSource 未正确映射存储过程的 NamedParameterJdbcTemplate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22444447/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com