Query dinámico por filtros en PL/SQL Oracle y MySQL.
null
, cuando pasamos null
indicamos que no vamos a buscar por ese parámetro, así que cuando armamos el query en Oracle vamos a ir preguntando si el parámetro recibido es distinto de null
y de ser el caso vamos agregarlo en el query si no lo ignoramos, ya que en medio del armado del query no podemos utilizar IF ELSE tenemos que hacerlo de la siguiente manera:
Metodos
PROCEDURE SP_OBT_ALUMNOS( i_sexo IN VARCHAR2, i_nombres IN VARCHAR2, i_apellidos IN VARCHAR2, i_edad IN NUMBER, o_numero_mensaje OUT NUMBER, o_mensaje OUT VARCHAR2, o_result_set OUT RESULT_SET )IS BEGIN OPEN o_result_set FOR SELECT ALUMNO.ID AS ID_ALUMNO, ALUMNO.NOMBRES AS NOMBRES ALUMNO.APELLIDOS AS APELLIDOS, ALUMNO.EDAD AS EDAD_ALUMNO FROM USER_DATOJAVA.ALUMNOS ALUMNO WHERE ALUMNO.SEXO = i_sexo --COMIENZAN LOS FILTROS --SI TODOS LOS CAMPOS SON DISTINTOS DE NULL, BUSCAR POR TODOS LOS FILTROS AND(((i_nombres IS NOT NULL AND i_apellidos IS NOT NULL AND i_edad IS NOT NULL) AND ALUMNO.NOMBRES = i_nombres AND ALUMNO.APELLIDOS = i_apellidos AND ALUMNO.EDAD = i_edad) -- BUSCAR SOLO POR SEXO Y EDAD OR((i_nombres IS NULL AND i_apellidos IS NULL AND i_edad IS NOT NULL) AND ALUMNO.EDAD = i_edad) -- BUSCAR SOLO SEXO, EDAD Y NOMBRES OR((i_nombres IS NOT NULL AND i_apellidos IS NULL AND i_edad IS NOT NULL) AND ALUMNO.EDAD = i_edad AND ALUMNO.NOMBRES = i_nombres) -- BUSCAR SOLO POR SEXO, EDAD Y APELLIDOS OR((i_nombres IS NULL AND i_apellidos IS NOT NULL AND i_edad IS NOT NULL)) AND ALUMNO.EDAD = i_edad AND ALUMNO.APELLIDOS = i_apellidos ) ORDER BY ALUMNO.SEXO; o_numero_mensaje := 0; o_mensaje := 'EXITO'; EXCEPTION WHEN OTHERS THEN o_numero_mensaje:=-1; o_mensaje:=dbms_utility.format_error_backtrace || sqlerrm; END SP_OBT_ALUMNOS;
Para hacer un query dinámico en MySQL desde Java es un poco distinto pero también es fácil, suponiendo el mismo caso anterior del colegio y el alumno se podría hacer de esta manera:
public List<Alumno> obtenerAlumnos(String nombres, String apellidos, int edad, String sexo) { Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; try { connection = getConnection(); StringBuilder query = new StringBuilder(); query.append("SELECT * FROM ALUMNOS WHERE 1 = 1 "); //CREAR EL QUERY DINAMICO DEPENDIENDO DE LO QUE NO ES NULL if(nombres != null){ query.append(" AND nombres = ?"); } if (apellidos != null) { query.append(" AND apellidos = ?"); } if(edad != 0){ query.append(" AND edad = ?"); } if (sexo != null) { query.append(" AND sexo = ?"); } preparedStatement = connection.prepareStatement(query.toString()); int count = 0; if(nombres != null){ count++; preparedStatement.setString(count, nombres); } if (apellidos != null) { count++; preparedStatement.setString(count, apellidos); } if(edad != 0){ count++; preparedStatement.setInt(count, edad); } if (sexo != null) { count++; preparedStatement.setString(count, sexo); } resultSet = preparedStatement.executeQuery(); // .......El truco esta en pasar los parámetros en
null
y en el contador que se va incrementando para pasar el parámetro correcto en la posición correcta en el PreparedStatement. Suerte, cualquier cosa comenta, no olvides compartir la entrada.
No hay comentarios :
Publicar un comentario