java - MapSqlParameterSource 无法与存储过程的 NamedParameterJdbcTemplate 正确映射

标签 java spring stored-procedures jdbctemplate

我试图使用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_reason 和 h_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/

相关文章:

mysql - 创建适用于 MySQL 中不同表的过程/函数

java - MyBatis - 将存储过程输出参数值映射到 POJO

Postgresql 自定义函数速度慢,php 但如果使用带有 gin 索引的文本搜索直接在 psql 上输入则速度很快

java - 向 Java 类添加编程注释

java - 处理 RestClientException 和 HttpClientErrorException

java - Lambda 运算符 () -> 如何工作?

java - 创建 EntityManager 时出现 BeanCreationException

java - Egit : Set gitignore to ignore all eclipse project files

java - PS MarkSweep 是哪个垃圾收集器

java - Spring - Http Basic Auth - 将端点标记为公共(public)