Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Ejecutar varias sentencias SQL con un executeUpdate()

Necesito insertar un pago y registrar el ID (autoincremenal) del mismo en otra tabla.
Mas o menos así:

String sql = "INSERT INTO 'pagos' (MONTO_PAGO) VALUE (300.0);
SET @te1 = (SELECT @@identity AS id);
UPDATE clientes_hr SET ID_PAGO = @te1 WHERE ID_HOJA_.....";

//Luego la llamada es

PreparedStatement ps=CONE.prepareStatement(sql);
ps.executeUpdate();

agosto 24, 2016 | Unregistered CommenterElaxo

final int BATCH_SIZE = 1000;
for (int i = 0; i < DATA_SIZE; i++) {
statement.setString(1, "a@a.com");
statement.setLong(2, 1);
statement.addBatch();
if (i % BATCH_SIZE == BATCH_SIZE - 1)
statement.executeBatch();
}
if (DATA_SIZE % BATCH_SIZE != 0)
statement.executeBatch();

agosto 25, 2016 | Unregistered Commenterraul

No es posible: cada comando SQL necesita su propio Statement.
@raul, usar un batch no le sirve porque quiere ejecutar comandos SQL distintos con un mismo Statement.

agosto 26, 2016 | Registered Commenterchoces

Hola.
Si se puede meter en un batch.
Ejemplo:


// Creando el Statement
Statement stmt = conn.createStatement();

// auto-commit a false
conn.setAutoCommit(false);

// Creamos el statement
String SQL = "INSERT INTO Empleado (id, Nombre, Apellido, Edad) " +
"VALUES(200,'Raul', 'Zavala', 22)";
// Agregamos el statement al batch
stmt.addBatch(SQL);

// Creamos un nuevo statent
String SQL = "INSERT INTO Administradores (id, Nombre, Apellido, Edad) " +
"VALUES(201,'Martha', 'Elizondo', 25)";
// Agregamos el nuevo statement al batch
stmt.addBatch(SQL);

// Creamos un statement para actualizar datos
String SQL = "UPDATE Empleado SET age = 28 " +
"WHERE id = 100";
//Agregamos el statement al batch
stmt.addBatch(SQL);

// Creamos un arreglo para que nos regrese el numero de sentencias que se estan ejecutando
int[] cuenta = stmt.executeBatch();

//Ejecutamos las acciones en la base de datos
conn.commit();

agosto 27, 2016 | Unregistered Commenterraul

@raul,
Con un PreparedStatement como el que usa, sigo sin ver cómo.
No sé, porque no lo dice, si puede usar Statement en vez de PreparedStatement, en cuyo caso sí que podría usar un batch como el que describes muy bien.

Evidentemente me he explicado mal en mi mensaje anterior: debería haber dicho PreparedStatement en vez de Statement.

agosto 27, 2016 | Registered Commenterchoces

Agregando un PrepareStatement a un batch; con cualquier sentecia SELECT, INSERT o UPDATE.
Se puede manejar así:


private void agregaUsuario() {
//Variable que almacena los milisegundo en que se inicia la ejecución del metodo
long Tinicio = System.currentTimeMillis()
List<Persona> listaPersona = DatosEmpleado();
try {
con.setCommitAuto(false);//Evitamos que se ejecuta la sentecia insert o update
pstm = con.prepareStatement(insertaEmpleado);
listaPersona.forEach(e->{
pstm.setInt(e.getID());
pstm.setString(e.setNombre());
pstm.setString(e.setEdad());
pstm.addBatch();//Agregamos los campos al batch
});
int logro[] = prep.executeBatch();//Ejecutamos el batch
checaRegistros(logro);
for (Integer lo : logro) {
System.out.printf("Número de insert en la base : %d%n", lo);
}
con.commit();//Aceptamos los cambios en la base de datos
} catch (SQLException e) {
// TODO: handle exception
System.err.println("Error "+ e.getLocalizableCause());
con.rollback();//Deshacemos los cambios si ocurre una excepción
}
long Tfinal = System.currentTimeMillis();//Final de ejecuión del metodo
System.out.printf("Tiempo total de ejecución: %f" , (Tfinal - Tinicio));

}

/*
* Metodo que devuelve los datos de usuario
* que vamos a ingresar en la base de datos
* Este metodo nos devuelve una lista de los
* empleados
*/
private List<Persona> DatosEmpleado() {
try {
//Lista persona que guarda los datos
List<Persona> per = new LinkedList<>();
//Nuestra consulta se establece
pstm = con.prepareStatement(DEVUELVEID);
//Ejecutamos nuestra consulta
resultado = pstm.executeQuery();
//Obtenemos las propiedades de los empleados
while(resultado.next()) {
//Los almacenamos en nuestra lista de empleados
per.add(new Persona(resutado.getInt(1),
resultado.getString(2),
resultado.getString(3)));
}
//Verificados que haya empleados en
//nuestra lista y si hay devolvemos
//nuetros empleados
if(!per.isEmpty()) {
return per;
}

} catch(SQLException e) {
System.err.println("Error "+ e.getLocalizableCause());
return null;
}
}


public static void checaRegistros(int[] cuentas) {
for (int i = 0; i < cuentas.length; i++) {
if (cuentas[i] >= 0) {
System.out.println("OK: Total de insert=" + cuentas[i]);
} else if (cuentas[i] == Statement.SUCCESS_NO_INFO) {
System.out.println("OK: Todos los registros ingresado");
} else if (cuentas[i] == Statement.EXECUTE_FAILED) {
System.out.println("No se pudierom ingresar los datos a la base");
}
}
}

agosto 27, 2016 | Unregistered Commenterraul

Claro. Así es como lo he usado siempre: agregando en un bucle los VALUES junto con un addBatch().

Sigo sin ver la relación con el asunto planteado al principio.

agosto 27, 2016 | Registered Commenterchoces