使用游标

时间:2018-02-03 11:58:51

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

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

我可以像使用" Callable Statement"这样的经典java那样做,但我认为有更好,更清洁的方法,怎么做?

例如,

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

姓名:NEO,玛丽 SURNAME:安德森,史密斯 性别:M,W 年龄:20岁,25岁 ROLL:TEST,TEST

b)另外,我们有一个包含HOME_TEST_PKG的程序包

  

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

     

IS

     

BEGIN

     

dbms_output.put_line(' Hello 1');

     

OPEN o_resp_set FOR SELECT姓名,姓,性别,年龄,人们在哪里滚动   名称= i_name;

     

dbms_output.put_line(' Hello 2');

     

异常       等等       THEN

dbms_output.put_line('Hello  3');

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

结束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);
}

2 个答案:

答案 0 :(得分:2)

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

  1. JPA / Hibernate

  2. 的JdbcTemplate

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

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

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

答案 1 :(得分:0)

我认为最简单的解决方案是使用@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);
}