code: public Object[] call(Sql sql) throws SQLException {
  		
  		long start =  System.currentTimeMillis();
  		
  		if (sql.validate() == false) {
  			return null;
  		}
  		
  		List<Object> result = new ArrayList<Object>();
  		
  		Statement stmt = null;
  		try {
  			stmt = this.createStatment(conn, sql);
  			if (stmt instanceof CallableStatement) {
  				CallableStatement callStmt = (CallableStatement)stmt;
  				callStmt.execute();
  				List<Object> tmpResults = this.getProcedureOutValue(callStmt, sql);
  				for (Object tmpResult : tmpResults) {
  					if (tmpResult instanceof ResultSet) {
  						result.add(getResultSet((ResultSet)tmpResult));
  					} else {
  						result.add(tmpResult);
  					}
  				}
  			}
  		} catch (SQLException e) {
  			throw e;
  		} finally {
  			try {
  				if (stmt != null && stmt.isClosed() == false) {
  					stmt.close();
  				}
  			} catch (SQLException e) {
  				logger.error(e.getMessage(), e);
  			}
  		}
  		
  		logger.debug(String.format("Execute %s used %d ms", sql.getSql(), System.currentTimeMillis() - start));
  		
  		return result.toArray();
  	}
docs: 执行存储过程
  
  @param sql 需要执行的存储过程
  
  @return 存储过程执行结果
  
  @throws SQLException SQL执行异常