Aunque hemos hablado varias veces de este framework de MySQL-MariaDB, hoy os traigo una nueva función, muy útil cuando necesitas realizar tareas repetitivas basadas en consultas. Se trata de utilizar call foreach. Aquí expongo un ejemplo práctico de cómo lo he usado yo para ejecutar una tarea concreta: reemplazar todos los valores nulos a cero en una tabla con un monton de campos.
Localizando los campos de la tabla
Para localizar los campos a los que aplicar la rutina, qué mejor que utilizar information_schema, que es una de las bases de datos internas de MySQL.
La consulta utilizada es esta, teniendo en cuenta que la base de datos se llama inst7 y la tabla se llama datos:
SELECT c.column_name FROM information_schema.`COLUMNS` c
WHERE TABLE_SCHEMA = “inst7” and TABLE_NAME = “datos” ORDER BY c.column_name
El resultado de la misma:
Ya tenemos todos los campos donde hay que modificar los datos que sean nulos a cero. Ahora sólo necesitamos construir la sentencia SQL, tal que así:
UPDATE datos SET campo = 0 WHERE campo is null
Usando foreach
La forma de utilizar foreach está explicada aquí: http://code.openark.org/blog/mysql/mysql-foreach, así que vamos a ponerla en práctica.
Foreach tiene una cosa muy buena, y es que la sintaxis nos permite usar {1} y {2} para nombrar al primer campo, al segundo, … En nuestro caso, sólo necesitamos 1 campo.
La sentencia que necesitamos preparar quedaría:
UPDATE datos SET ${1} = 0 WHERE ${1} is null
La sentencia a utilizar es:
call common_schema.foreach(‘SELECT c.column_name FROM information_schema.`COLUMNS` c
WHERE TABLE_SCHEMA = “inst7” and TABLE_NAME = “datos”‘,’UPDATE inst7.datos SET ${1} = 0 WHERE ${1} is null’);
Y aquí tenemos ejecutándo el proceso:
En definitiva, una función muy practica para ejecutar tareas repetitivas, utilizando un framework muy completo. Observese que no ha hecho falta utilizar la función CONCAT para unir cadenas!
Espero que les sea de utilidad.