幾種應用程式呼叫Oracle儲存過程的方法
阿新 • • 發佈:2019-01-04
一、Java中呼叫帶Cursor的儲存過程:
儲存過程定義:
PROCEDURE GET_CURSOR_RESULT2(CR OUT CURSOR_RESULT) IS
BEGIN
OPEN CR FOR
select t1.id, t1.account_id, t2.account, t1.key, t1.total, t1.status
from table t1;
END GET_CURSOR_RESULT2;
呼叫GET_CURSOR_RESULT2儲存過程:
jdbcTemplate.execute(new CallableStatementCreator() { public CallableStatement createCallableStatement(Connection con) throws SQLException { CallableStatement cs = con.prepareCall("{call TRAIL_GETCURSOR.GET_CURSOR_RESULT2(?)}"); cs.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR); return cs; } }, new CallableStatementCallback<List<Account>>() { public List<Account> doInCallableStatement(CallableStatement cs) { List<Account> accounts = null; ResultSet rs = null; cs.execute(); rs = (ResultSet) cs.getObject(1); while(rs.next()) { long id = rs.getLong("id"); String accountName = rs.getString("account"); long accountID = rs.getLong("account_id"); long key = rs.getLong("key"); long total = rs.getLong("total"); accounts.set... } return accounts; });
jdbcTemplate.execute()有兩個引數:CallableStatement和CallableStatementCallback
二、Java中保證呼叫儲存過程的事務
transTemplate.execute(new TransactionCallback() { public Object doInTransaction(TransactionStatus status) { try{ success=jdbcTemplate.execute(...); if(!success) { status.setRollbackOnly(); } } catch(e) { status.setRollbackOnly(); } );
在jdbcTemplate外面包上一個transTemplate,通過判斷jdbcTemplate執行結果決定是否回退 status.setRollbackOnly()