1. 程式人生 > >幾種應用程式呼叫Oracle儲存過程的方法

幾種應用程式呼叫Oracle儲存過程的方法

一、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()