JdbcTemplate调用存储过程(ORACLE版)

453 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

先创建一个存储过程

create or replace package pck_binding_video is
    PROCEDURE prc_binding(P_date date,
                          P_count out number,
                          P_RESULT_CODE OUT NUMBER, /*返回结果 1成功 0失败*/
                          P_RESULT_MESSAGE OUT VARCHAR2 /*返回信息*/);
end;

方法一、 执行但不能获取出参

final Object[] objects = {new Date(), 0, 0, ""};
final int update = jdbcTemplate.update("{CALL pck_binding_video.prc_binding(?,?,?,?)}", objects);
Arrays.stream(objects).forEach(System.out::println);

这种写法执行了存储过程,但objects的值不会更改

方法二、 执行并且获取出参

final Response execute = jdbcTemplate.execute("{CALL pck_binding_video.prc_binding(?,?,?,?)}",
        (CallableStatementCallback<Response>) cs -> {
            final Date sqlDate = new Date();
            cs.setDate("P_date", sqlDate);
            cs.registerOutParameter("P_count", Types.INTEGER);
            cs.registerOutParameter("P_RESULT_CODE", Types.INTEGER);
            cs.registerOutParameter("P_RESULT_MESSAGE", Types.VARCHAR);
            cs.execute();

            final Response response = new Response();
            response.setData(sqlDate);
            response.setCode(cs.getInt("P_RESULT_CODE"));
            response.setMsg(cs.getString("P_RESULT_MESSAGE"));
            response.setCount(cs.getLong("P_count"));
            return response;
        });