## Actualizar Tablas

Supongamos que después de una primera semana exitosa, el propietario de "The Coffee Break" quiere actualizar la columna SALES de la tabla COFFEES introduciendo el número de libras vendidas de cada tipo de café. La sentencia SQL para actualizar una columna se podría parecer a esto:

    String updateString = "UPDATE COFFEES " +
    	"SET SALES = 75 " +
    	"WHERE COF_NAME LIKE 'Colombian'";

Uitlizando el objeto stmt, este código JDBC ejecuta la sentencia SQL contenida en updateString:

    stmt.executeUpdate(updateString);

La tablaCOFFEES ahora se parecerá a esto:

COF_NAME | SUP_ID | PRICE | SALES | TOTAL
--- | --- | --- | --- | ---
#### Colombian | 101 | 7.99 | 75 | 0
#### French_Roast | 49 | 8.99 | 0 | 0
#### Espresso | 150 | 9.99 | 0 | 0
#### Colombian_Decaf | 101 | 8.99 | 0 | 0
#### French_Roast_Decaf | 49 | 9.99 | 0 | 0

Observa que todavía no hemos actualizado la columna TOTAL, y por eso tiene valor 0.

Ahora seleccionaremos la fila que hemos actualizado, recuperando los valores de las columnas COF_NAME y SALES, e imprimiendo esos valores:

    String query = "SELECT COF_NAME, SALES FROM COFFEES " +
    	       "WHERE COF_NAME LIKE 'Colombian'";
    ResultSet rs = stmt.executeQuery(query);
    while (rs.next()) {
    		String s = rs.getString("COF_NAME");
    		int n = rs.getInt("SALES");
    		System.out.println(n + " pounds of " + s +
     						  " sold this week.")
    }

Esto imprimira lo siguiente:

    75 pounds of Colombian sold this week.

Cómo la claúsula WHERE límita la selección a una sóla línea, sólo hay una línea en la ResultSet: rs y una línea en la salida. Por lo tanto, sería posible escribir el código sin un bucle while:

    rs.next();
    String s = rs.getString(1);
    int n = rs.getInt(2);
    System.out.println(n + " pounds of " + s + " sold this week.")

Aunque hay una sóla línea en la hoja de resultados, necesitamos utilizar el método next para acceder a ella. Un objeto ResultSet se crea con un cursor apuntando por encima de la primera fila. La primera llamada al método next posiciona el cursor en la primera fila (y en este caso, la única) de rs. En este código, sólo se llama una vez a next, si sucediera que existiera una línea, nunca se accedería a ella.

Ahora actualizaremos la columna TOTAL añadiendo la cantidad vendida durante la semana a la cantidad total existente, y luego imprimiremos el número de libras vendidas hasta la fecha:

    String updateString = "UPDATE COFFEES " +
    		      "SET TOTAL = TOTAL + 75 " +
    		      "WHERE COF_NAME LIKE 'Colombian'";
    stmt.executeUpdate(updateString);
    String query = "SELECT COF_NAME, TOTAL FROM COFFEES " +
    				   "WHERE COF_NAME LIKE 'Colombian'";
    ResultSet rs = stmt.executeQuery(query);
    while (rs.next()) {
    		String s = rs.getString(1);
    		int n = rs.getInt(2);
    		System.out.println(n + " pounds of " + s + " sold to date.")
    }

Observa que en este ejemplo, utilizamos el índice de columna en vez del nombre de columna, suministrando el índice 1 a getString (la primera columna de la hoja de resultados es COF_NAME), y el índice 2 a getInt (la segunda columna de la hoja de resultados es TOTAL). Es importante distinguir entre un índice de columna en la tabla de la base de datos como opuesto al índice en la tabla de la hoja de resultados. Por ejemplo, TOTAL es la quinta columna en la tabla COFFEES pero es la segunda columna en la hoja de resultados generada por la petición del ejemplo anterior.

Ozito