2010-07-29 12 views
10

me gustaría ejecutar algo como esto en mi servidor MySQL:¿Puedo usar declaraciones múltiples en una consulta preparada para JDBC?

SET @id=(SELECT id FROM lookupTable WHERE field=?); 
(SELECT * FROM table2 WHERE [email protected]) 
UNION 
(SELECT * FROM table3 WHERE [email protected]) 
UNION 
(SELECT * FROM table4 WHERE [email protected]); 

Esto funciona bien desde la consola, pero no de mi Java PreparedStatement. Lanza una excepción con un error de sintaxis en el ';' separando las declaraciones. Me gusta la variable porque no tengo que repetir la cláusula de búsqueda, pero podría reescribirla si fuera necesario. El equivalente JOIN es un poco incómodo con las cláusulas de UNIÓN también.

Gracias,

Joshua

+0

Como dice @ddimitrov, esto no parece posible directamente. No intenté 'PreparedStatement.addBatch()'. Un procedimiento almacenado probablemente también funcione para esto. –

+0

Si está interesado en otros proveedores, la Base de datos CUBRID admite esta característica. Ver esta publicación en el foro http://www.cubrid.org/forum/534638. – Eye

Respuesta

5

JDBC nunca ha admitido el análisis de consultas delimitadas. Cada invocación es un viaje a la base de datos. ¿Quizás pueda lograr lo que pretende hacer con PreparedStatement.addBatch() para cada consulta por separado, y luego ejecutar y recuperar los dos conjuntos de resultados?

2

Sólo ejecutar este como dos consultas separadas (dentro de una conexión) deben darle mismos resultados.

+0

Esperaba evitar el tiempo de red dos veces, pero parece inevitable aquí. Tal vez esta es una característica de seguridad para evitar la inyección de SQL. –

+1

@Joshua, puede realizar consultas por lotes en el servidor y evitar los múltiples viajes de red. – ddimitrov

Cuestiones relacionadas