首页 文章

用光标调用Springboot java oracle过程

提问于
浏览
0

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

我可以像使用“Callable Statement”一样在经典java中做到这一点,但我认为有更好,更清洁的方法,如何做到这一点?

例如,

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

姓名:NEO,Mary SURNAME:ANDERSON,Smith性别:男,女年龄:20岁,25岁:测试,测试

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

PROCEDURE show_people_data(i_name IN VARCHAR2,o_resp_set OUT SYS_REFCURSOR)是BEGIN dbms_output.put_line('Hello 1'); OPEN o_resp_set FOR SELECT name,surname,sex,age,roll from name where = i_name; dbms_output.put_line('Hello 2');等等,然后是dbms_output.put_line('Hello 3');

打开o_resp_set FOR SELECT'出错'作为双重错误;
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);
}

1 回答

相关问题