使用execute()方法

当SQL语句执行后会返回多个ResultSet对象、多个更新记录数或ResultSet对象与更新计数的组合时,通常使用execute方法。当同时执行多个SQL语句、执行某个存储过程或动态执行未知SQL字符串(即应用程序程序员在编译时未知)时,就有可能出现多个结果的情况,因此在这种情况下就需要使用execute(),因为execute()方法同时适用于对有ResultSet对象返回和有更新记录数返回的情况。

如果不知道返回结果的类型,则可以通过execute方法的返回值来进行判断。如果结果是ResultSet对象,则方法execute返回true;如果结果类型是更新纪录数,则返回false。如果返回int,则意味着结果是更新记录数或执行的语句是DDL命令。在调用方法execute之后可以调用getResultSet()或getUpdateCount()。其中getResultSet()方法获得当前结果集,而getUpdateCount()获得记录的更新数。

当SQL语句的返回结果不是结果集时,则方法getResultSet将返回null。这可能意味着结果是一个更新记录数或没有其它结果。在这种情况下,判断null真正含义的方法是调用方法getUpdateCount(),它将返回一个整数。这个整数为调用语句所影响的行数;如果为-1则表示结果是结果集或没有结果。如果方法getResultSet已返回null(表示结果不是ResultSet对象),则返回值-1表示没有其它结果。也就是说,当下列条件((stmt.getResultSet()== null)&&(stmt.getUpdateCount()== -1))为真时表示没有结果(或没有其它结果)。

下面给了一个示例,用于执行未知sql语句的情况下作判断:

		String sql;
		/*
		 * 对字符串sql进行赋值,可以是单条SQL语句, 也可以是用;分隔的多条SQL语句
		 */
		sql =  "UPDATE TEST "
			+"SET value = 'change' WHERE id = 1";;
		boolean b;
		try {
			Statement stmt = con.createStatement();
			b = stmt.execute(sql);
			if (b == true) {
				// 说明返回的是ResultSet对象
				ResultSet rs;
				rs = stmt.getResultSet();
				while (rs.next()) {
					//处理
				}
			} else {
				// 说明返回的是更新记录数
				int rows = stmt.getUpdateCount();
				assertNotEquals(-1, rows);
			}
			stmt.close();

			con.close();
		} catch (SQLException e) {
			fail(e.getMessage());
		}

如果执行方法execute()后得到多个结果集,则需要借助getMoreResults()来获取额外的结果集。execute()方法返回的结果,用于表示第一条SQL语句的执行结果,如果为true就表示有结果集返回,如果为false就表示有记录更新。对于第二条以后的SQL语句的执行结果,则用getMoreResults()方法去获得,同上面一样如果为true就表示有结果集返回,如果为false就表示有记录有更新。最后当(getMoreResults() == false) &&(getUpdateCount() == -1)时表示后面再也没有执行语句返回的结果了。

下面是一个例子,execute()方法的输入参数是多个用分号分隔的SQL语句:

		Statement stmt;
		
		boolean retVal;
		try {
			String sql = "SELECT ID FROM TEST WHERE ID > 0;" 
					+ "INSERT INTO TEST VALUES(20,'VALUE20');"
					+ "SELECT VALUE FROM TEST WHERE ID > 10";
			stmt = con.createStatement();
			retVal = stmt.execute(sql);
			ResultSet rs;
			int count;
			do {
				if (retVal == false) {
					// 如果没有结果集
					count = stmt.getUpdateCount();
					if (count == -1) {
						// 说明既没有结果集,也没有更新的记录数,即下面再也没有
						// results了,跳出循环
						break;
					} else {
						// 如果有记录被更新
						// <some code>
					}
				} else { // 有结果集返回
					rs = stmt.getResultSet();
					// 处理ResultSet
				}
				// 获得下一个结果集或更新的记录数
				retVal = stmt.getMoreResults();
			} while (true);
		} catch (SQLException e) {
			fail(e.getMessage());
		}