martes, 30 de septiembre de 2014

Scrip shell consulta base de datos y guarda resultados a un archivo

En el siquiente ejemplo veremos como hacer consultas mediante un archivo bash y guardar los resultados en un archivo de texto plano, para esto ocuparemos Mysql y 4 tablas: Emrpesa, Llamadas, Opciones y Transacciones. Este archivo bash sacará en 3 archivos de texo la info de cada Llamada.

La estructura de cada tabla seria así:

Tabla Empresa

Descripción: Aquí se guardaran las distintas empresas telefónicas como Claro, Entel, Movistar, etc. y por cada una se hara un informe el cual tendra 3 archivos: Llamadas, Opciones y Transacciones.

id_empresa (autoincremental),
nombre_empresa

Tabla Llamadas:

Descripción: Registra cada llamda hecha al menú de autoatención de cada empresa.

id_llamada (autoincremental),
id_empresa,
duracion_total,
numero_origen,
numero_destino,
fecha_inicio,
fecha_fin


Tabla Opciones:

Descripción: Registra las opciones presinadas por el cliente al momento de llamar a la central (Menú de autoatención como por ejemplo  Entel 103)

id_opcion (autoincremental)
id_llamada,
opcion_presionada

Tabla Transacciones:

Descripción : Cuando se presiona una opción del menú de autoatención, se gatillan transacciones, las cuales se registran en esta tabla.

id_trx (autoincremental),
id_llamada,
nombre_trx,
resultado,
duracion

nota: los campos que estan en negrita son referencias de otras tablas, por lo que la relacion entre estas tablas es de 1 a muchas.

Generamos el archivo bash que se guarda con extención .sh, ejemplo: informe.sh y se puede ejecutar así:

1) ./informe.sh
2) sh informe.sh
3) bash informe.sh

#!/bin/bash
user="usuario"
pass="xxxxxx"
db="BaseDeDatoAConectarMysql"


#opcines de columnas en Mysql
opc="--skip-column-names"


#Se necesita que el archivo tenga en su nombre la fecha de ayer
fecha=$(date --date="yesterday" +"%Y%m%d")


#Se quiere 3 informes que sean del dia anterior, ejemplo si hoy es 02/08/2014, entonces

#se requiere un informe de todo el día de ayer de '01/08/2014' hasta '01/08/2014 23:59:59'
#ponermos el intervalo de dias en -1 para restar un dia
intervalo="-1"

#se crea consulta y conexion a mysql. Esta obtiene todas las empresas que seran consultadas #empresa de telefonia (Tabla Empresa).


dbquery=$(mysql -u $user -p$pass $opc -e "use $db;SELECT id_empresa FROM Empresa ")

#se guardan los resultados en un array
arrayApp=($(for i in $dbquery;do echo $i;done))

#corroboramos que esten todos los datos en el array. Descomentar la siguiente linea
#echo ${arrayApp[@]};


#se recorre el array para ejecutar las querys
for i in ${arrayApp[@]}
do
nameFile1="_llamadas_$fecha.txt";
query="SELECT   LLA.id_llamada ID_LLAMADA,
LLA.id_empresa ,
LLA.duracion_total ,
LLA.numero_origen,
LLA.numero_destino,
LLa.fecha_inicio,
LLA.fecha_fin,
INTO OUTFILE '/rutaDondeSeGuardara/
$i$nameFile1' FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n'
FROM LLAMADAS LLA
WHERE LLA.fecha_inicio>= (CURDATE()
$intervalo - INTERVAL 0 DAY + INTERVAL 0 SECOND)
AND LLA.fecha_fin<= (CURDATE()
$intervalo - INTERVAL 0 DAY + INTERVAL 86399 SECOND)
AND LLA.id_empresa='
$i'
ORDER BY LLa.fecha_inicio ASC;"
;
mysql -u $user -p$pass -e "use $db;$query"

nameFile2="_opciones_$fecha.txt";
query="SELECT OPC.id_llamada ID_LLAMADA,
OPC.OPCION OPCION
INTO OUTFILE '/
rutaDondeSeGuardara/$i$nameFile2' FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n'
FROM OPCIONES OPC,
LLAMADAS LLA
WHERE 
LLA.fecha_inicio >= (CURDATE()$intervalo - INTERVAL 0 DAY + INTERVAL 0 SECOND)
AND 
LLA.fecha_fin <= (CURDATE()$intervalo - INTERVAL 0 DAY + INTERVAL 86399 SECOND)

AND LLA.id_empresa='$i'
AND 
LLA.id_llamada=OPC.id_llamada

ORDER BY LLA.fecha_inicio ASC;";
mysql -u $user -p$pass -e "use $db;$query";

nameFile3="_transac_$fecha.txt";
query="SELECT TRX.id_llamada ID_LLAMADA,
TRX.nombre_trx,
TRX.resultado,
TRX.duracion
INTO OUTFILE '/
rutaDondeSeGuardara/$i$nameFile3' FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n'
FROM Llamadas LLA,
Transacciones TRX
WHERE 
LLA.fecha_inicio >= (CURDATE()$intervalo - INTERVAL 0 DAY + INTERVAL 0 SECOND)
AND 
LLA.fecha_fin <= (CURDATE()$intervalo - INTERVAL 0 DAY + INTERVAL 86399 SECOND)

AND LLA.id_empresa='$i'
AND LLA.id_llamada=TRX.id_llamada
ORDER BY LLA.fecha_inicio ASC"
;
mysql -u $user -p$pass -e "use $db;$query";
done



Nota: este codigo fue testeado en un Shell, pero se cambiaron las tablas de las consultas, las cuales no estan testeadas, por lo que puede existir un error de consultas.