【问题标题】:How to make a simple call to a stored procedure or function in spring mvc using JdbcTemplate如何使用 JdbcTemplate 在 spring mvc 中对存储过程或函数进行简单调用
【发布时间】:2015-03-06 19:42:30
【问题描述】:

我已经阅读了很多关于如何使用 JdbcTemplate 调用存储过程的问题,有很多方法,例如使用 beanMapper、创建 rowMapper、使用 callableStatement,但我看到很多人这样说:

对于简单的程序,您可以使用 jdbcTemplate 的更新方法:

jdbcTemplate.update("call SOME_PROC (?, ?)", param1, param2);

我尝试这样做,我的 jdbcTemplate 变量始终为空,这是我的存储过程

CREATE OR REPLACE PROCEDURE addProce
    (
       num1 IN number,
       num2 IN number,
       result OUT number
    )
IS
BEGIN
    result := num1 + num2;

END;
/

这就是我称之为的类

public class UsuerDAOImpl implements UserDAO {

    private JdbcTemplate jdbcTemplate;

    public UsuerDAOImpl () {}

    public UsuerDAOImpl (DataSource datasource) {
        this.jdbcTemplate  =  new JdbcTemplate(datasource);
    }

     public int addmethodJdbc() 
     {
        int result= 0;
         int someValue= jdbcTemplate.update("addProce(?, ?, ?)", 2, 1, result);

        return someValue;
    }
}

我的课堂上有这个方法,它可以工作,我的 jdbctemplate 不为空

public void insertUser(User user) {

    try {
        String sql = "INSERT INTO USER"
                + "(a, b, c, d)"
                + " VALUES (?, ?, ?, ?)";

        jdbcTemplate.update(sql, user.getA(),
                usaurio.getB(),
                usaurio.getC(),
                usaurio.getD());
    } 
    catch (DataAccessException dataAccessException) 
    {

        dataAccessException.printStackTrace();
    }
    catch(Exception e) 
    {

        e.printStackTrace();
    }
}   

我也在这里尝试了一个函数:

CREATE OR REPLACE FUNCTION addFunct
    (
       num1 IN number,
       num2 IN number
    )
    return number
IS
resultado number;
BEGIN
    result := num1 + num2;
    return (result);
END;
/

但我的 jdbcTemplate 仍然无效

我已经知道如何用其他方式调用它们,但我想知道如何以这种简单的方式调用它们

jdbcTemplate.update("call SOME_PROC (?, ?)", param1, param2);

【问题讨论】:

    标签: java spring spring-mvc stored-procedures jdbctemplate


    【解决方案1】:

    使用SimpleJdbcCall#withProcedureName() 调用存储过程。将存储过程的名称作为参数传递。

    例如你的方法:

    public int addmethodJdbc() {
       SimpleJdbcCall jdbcCall =  new SimpleJdbcCall(jdbcTemplate).withProcedureName("addFunct");
       SqlParameterSource in = new MapSqlParameterSource().addValue("num1", 2).addValue("num2", 1);
    
       Map<String, Object> out = jdbcCall.execute(in)
       int result = (Integer)out.get("result");
       return result;
    }
    

    【讨论】:

    • 它在这一行给了我空指针异常int result = (Integer)out.get("result");
    • 我尝试使用 addProce 过程而不是带有 addFunct 的 addFunct 它给了我这个错误:CallableStatementCallback; bad SQL grammar [{call addFunct(?, ?)}]; nested exception is java.sql.SQLException: ORA-06550: line 1, column 7
    • 是的,我知道它是用“withProcedureName”我用我的程序尝试过的,我用“withFunctionName”试过,但它给出了我告诉你朋友的同样的错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-04
    相关资源
    最近更新 更多