src/org/nutz/dao/impl/sql/run/NutDaoExecutor.java
protected void _runExec(Connection conn, DaoStatement st) throws SQLException {
		if (st.getContext().getPager() != null) {
			throw Lang.makeThrow(DaoException.class, "NOT Pageable : " + st);
		}
		
		// 打印调试信息
		String sql = st.toPreparedStatement();
        if (log.isDebugEnabled())
            log.debug(sql);
		
		Object[][] paramMatrix = st.getParamMatrix();
		
		CallableStatement stmt = null;
		ResultSet rs = null;
		try {
            stmt = conn.prepareCall(sql);
            ValueAdaptor[] adaptors = st.getAdaptors();
            HashMap<Integer, OutParam> outParams = new HashMap<Integer, OutParam>();
            if (st instanceof Sql) {
                VarIndex varIndex = ((Sql) st).paramIndex();
                VarSet varSet = ((Sql) st).params();
                for (int i = 0; i < varIndex.size(); i++) {
                    String name = varIndex.getOrderName(i);
                    if (name.startsWith("OUT") && varSet.get(name).getClass() == Integer.class) {
                        Integer t = (Integer) varSet.get(name);
                        outParams.put(i, new OutParam(name, t));
                    }
                }
            }
			// 创建语句并设置参数
            if (paramMatrix != null && paramMatrix.length > 0) {
                PreparedStatement pst = (PreparedStatement) stmt;
                Object[] pm = paramMatrix[0];
                for (int i = 0; i < pm.length; i++) {
                    OutParam outParam = outParams.get(i);
                    if (outParam == null)
                        adaptors[i].set(pst, pm[i], i + 1);
                    else
                        stmt.registerOutParameter(i + 1, outParam.jdbcType);
                }
            }

			stmt.execute();

            if (outParams.size() > 0) {
                Record r = Record.create();
                for (Entry<Integer, OutParam> en : outParams.entrySet()) {
                    OutParam outParam = en.getValue();
                    int jdbcIndex = en.getKey() + 1;
                    Object value;
                    switch (outParam.jdbcType) {
                    case Types.INTEGER:
                        value = stmt.getInt(jdbcIndex);
                        break;
                    case Types.TIMESTAMP:
                        value = stmt.getTimestamp(jdbcIndex);
                        break;
                    case Types.CLOB:
                        value = stmt.getString(jdbcIndex);
                        break;
                    case Types.DATE:
                        value = stmt.getDate(jdbcIndex);
                        break;
                    default:
                        value = stmt.getObject(jdbcIndex);
                        break;
                    }
                    r.set(outParam.name.substring(3), value);
                }
                st.getContext().attr("OUT", r);
            }
			//先尝试读取第一个,并调用一次回调
			rs = stmt.getResultSet();
			try {
				st.onAfter(conn, rs, null);
			}
			finally {
				if (rs != null)
					rs.close();
			}
			
			while (true) {
				if (stmt.getMoreResults()) {
					rs = stmt.getResultSet();
					try {
						if (rs != null)
							st.onAfter(conn, rs, null);
					}
					finally {
						if (rs != null)
							rs.close();
					}
				}
				break;
			}
		}
		finally {
			if (stmt != null)
				stmt.close();
		}
	}
protected void _runExec(Connection conn, DaoStatement st) throws SQLException {
		if (st.getContext().getPager() != null) {
			throw Lang.makeThrow(DaoException.class, "NOT Pageable : " + st);
		}
		
		// 打印调试信息
		String sql = st.toPreparedStatement();
        if (log.isDebugEnabled())
            log.debug(sql);
		
		Object[][] paramMatrix = st.getParamMatrix();
		
		CallableStatement stmt = null;
		ResultSet rs = null;
		try {
            stmt = conn.prepareCall(sql);
            ValueAdaptor[] adaptors = st.getAdaptors();
            HashMap<Integer, OutParam> outParams = new HashMap<Integer, OutParam>();
            if (st instanceof Sql) {
                VarIndex varIndex = ((Sql) st).paramIndex();
                VarSet varSet = ((Sql) st).params();
                for (int i = 0; i < varIndex.size(); i++) {
                    String name = varIndex.getOrderName(i);
                    if (name.startsWith("OUT") && varSet.get(name).getClass() == Integer.class) {
                        Integer t = (Integer) varSet.get(name);
                        outParams.put(i, new OutParam(name, t));
                    }
                }
            }
			// 创建语句并设置参数
            if (paramMatrix != null && paramMatrix.length > 0) {
                PreparedStatement pst = (PreparedStatement) stmt;
                Object[] pm = paramMatrix[0];
                for (int i = 0; i < pm.length; i++) {
                    OutParam outParam = outParams.get(i);
                    if (outParam == null)
                        adaptors[i].set(pst, pm[i], i + 1);
                    else
                        stmt.registerOutParameter(i + 1, outParam.jdbcType);
                }
            }

			stmt.execute();

            if (outParams.size() > 0) {
                Record r = Record.create();
                for (Entry<Integer, OutParam> en : outParams.entrySet()) {
                    OutParam outParam = en.getValue();
                    int jdbcIndex = en.getKey() + 1;
                    Object value;
                    switch (outParam.jdbcType) {
                    case Types.INTEGER:
                        value = stmt.getInt(jdbcIndex);
                        break;
                    case Types.TIMESTAMP:
                        value = stmt.getTimestamp(jdbcIndex);
                        break;
                    case Types.CLOB:
                        value = stmt.getString(jdbcIndex);
                        break;
                    case Types.DATE:
                        value = stmt.getDate(jdbcIndex);
                        break;
                    default:
                        value = stmt.getObject(jdbcIndex);
                        break;
                    }
                    r.set(outParam.name.substring(3), value);
                }
                st.getContext().attr("OUT", r);
            }
			//先尝试读取第一个,并调用一次回调
			rs = stmt.getResultSet();
			try {
				st.onAfter(conn, rs, null);
			}
			finally {
				if (rs != null)
					rs.close();
			}
			
			while (true) {
				if (stmt.getMoreResults()) {
					rs = stmt.getResultSet();
					try {
						if (rs != null)
							st.onAfter(conn, rs, null);
					}
					finally {
						if (rs != null)
							rs.close();
					}
				}
				break;
			}
		}
		finally {
			if (stmt != null)
				stmt.close();
		}
	}
执行存储过程,简单实现