【发布时间】: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