【问题标题】:Springboot java oracle procedure calling with cursorSpringboot java oracle过程调用游标
【发布时间】:2018-07-13 19:20:54
【问题描述】:

我是春天世界的新人。 我有一个问题,关于从 oracle 包调用过程并将 CURSOR 返回到 Spring 的更好方法是什么?

我可以像在经典 java 中使用“可调用语句”那样做到这一点,但我认为还有更好、更简洁的方法,如何做到这一点?

例如,

a) 我们有一个简单的表 PEOPLE_TAB,其中是:

姓名:NEO,玛丽 姓氏:安德森,史密斯 性别:男,女 年龄: 20, 25 滚动:测试,测试

b) 另外,我们有一个带有过程的包 HOME_TEST_PKG

程序 show_people_data( i_name IN VARCHAR2, o_resp_set OUT SYS_REFCURSOR)

开始

dbms_output.put_line('Hello 1');

OPEN o_resp_set FOR SELECT name, surname, sex, age, roll from people where name=i_name;

dbms_output.put_line('Hello 2');

例外 当其他人 那么

dbms_output.put_line('Hello  3');

OPEN o_resp_set FOR SELECT 'something wrong' as error from dual;

END show_people_data;

c) 然后,我们有一个示例 java 代码,它在 Spring 中工作:

@RequestMapping(value = "/DBtest")
@ResponseBody
public Map DBtest() throws SQLException {

private String PROCEDURE_NAME = "{call test.home_test_pkg.show_people_data(?,?)}";

    JSONObject answer = new JSONObject();
    CallableStatement stmt = null;
    Connection conn = null;
    ResultSet rset = null;
    String testNameNeo="NEO"; --simple check input for procedure
    try {
        conn = DriverManager.getConnection(
                "jdbc:oracle:thin:@localhost:1521:XE", "testname", "testpass");
        stmt = conn.prepareCall(PROCEDURE_NAME);
        stmt.setString(1, testNameNeo);
        stmt.registerOutParameter(2, OracleTypes.CURSOR);
        stmt.execute();
        rset = (ResultSet) stmt.getObject(2);

        while (rset.next()) {
            String name = rset.getString(1);
            log.info(name);
            answer.put("name",rset.getObject(1).toString());
            answer.put("surname",rset.getObject(2).toString());
        }
    }catch (Exception a){
        log.error("Exception "+a);
    }finally {
        rset.close();
        stmt.close();
        conn.close();
    }
    return Collections.singletonMap("response", answer);
}

【问题讨论】:

    标签: java spring oracle spring-boot stored-procedures


    【解决方案1】:

    Spring Boot 集成了两种用于处理关系数据库的技术:

    1. JPA/休眠

    2. JdbcTemplate

    这两种技术都可以使用 Oracle 游标。

    对于JPA / Hibernate,有一个很好的例子:How to call Oracle stored procedures and functions with JPA and Hibernate

    对于JdbcTemplate,请看:Spring - Returning REF Cursor from a SimpleJdbcCall

    【讨论】:

    • 林戈商店!谢谢你的主意!我已经尝试了这两种方法,我发现 SimpleJdbc 是更好的方法。对于其他我尝试过 JPA 的东西,也不错!谢谢!!
    【解决方案2】:

    我认为最简单的解决方案是使用@Procedure 注解创建存储库接口,如下例所示。

    @Repository
    public interface MyRepository extends CrudRepository<MyEntity, Long> {
    
      @Procedure(name = "test.home_test_pkg.show_people_data")
      List<MyEntity> getPeopleData(@Param("my_param_in") String myParamIn);
    }
    

    【讨论】:

      猜你喜欢
      • 2017-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多