Springboot java oracle过程用游标调用

Dan*_*iel 2 java oracle spring stored-procedures spring-boot

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

我可以像在经典java中一样使用“Callable Statement”来做到这一点,但我认为还有更好、更简洁的方法,怎么做呢?

例如,

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

姓名:NEO,玛丽 姓氏:ANDERSON, Smith 性别:男,工资:20, 25 滚动:测试,测试

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

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

开始

dbms_output.put_line('你好1');

OPEN o_resp_set FOR 从 name=i_name 的人中选择姓名、性别、年龄、姓名;

dbms_output.put_line('你好2');

其他人则例外

dbms_output.put_line('Hello  3');

OPEN o_resp_set FOR SELECT 'something wrong' as error from dual;
Run Code Online (Sandbox Code Playgroud)

END show_people_data;

c) 然后,我们有一个在 Spring 中运行的示例 java 代码:

@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);
}
Run Code Online (Sandbox Code Playgroud)

Rin*_*ore 5

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

  1. JPA/休眠

  2. Jdbc模板

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

对于JPA / Hibernate,有一个很好的例子:如何使用 JPA 和 Hibernate 调用 Oracle 存储过程和函数

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