(script) Descarga de información de BD

Buen día. Quiero compartir con ustedes este intento de script. Solo automatiza la descarga de información basada en sentencias de base de datos (con sqlplus) en un archivo de texto plano y separado por un delimitador. Cualquier comentario, sugerencia o mentada es bienvenida…

#!/bin/sh
ayuda () { echo '
#========================================================================================================
#
#        SCRIPT:  descargaDATOS-sql.sh
#
#           USO:  ./descargaDATOS-sql.sh [-b BD] [-s] [-d delimitador] [-o destino] sentencia
#                 ./descargaDATOS-sql.sh [-b BD] [-s] [-d delimitador] [-o destino] -f sentencias
#
#   DESCRIPCION:  Permite realizar una sentencia en la bd indicada y el resultado
#                 se entrega separado por $sep y se puede guardar en archivo o en consola
#
#      OPCIONES:  -b BD          Indica la base de datos a usar. Por omision es BD1usuarioA
#                                si el que recibe no lo encuentra, emplea esa cadena.
#                 -s             Conservar el espacio vacio del campo (SI). Por omision NO.
#                 -d delimitador El delimitador entre campos. Por omision |
#                 -o destino     Archivo donde se guarda el resultado
#                 -f sentencias  Archivo donde se encuentran las sentencias. Por omision se ejecuta la
#                                sentencia del parametro, por lo que son mutuamente excluyentes.
#  DEPENDENCIAS:  sqlplus
#          BUGS:  ---
#         NOTAS:  Si existe error en el sql termina con estado 1 y deja el log en /tmp
#     VERSIONES:  20081216 0.0.4 OHS Cambio en de [-s SI] a [-s]
#                 20081120 0.0.3 OHS Se valida error en sentecias
#                 20081118 0.0.2 OHS Se agrego escoger BD y paso por opciones
#                 20081113 0.0.1 OHS Creacion
#           URL:  http://petrohs.googlepages.com/descargaDATOS-sql.sh
#========================================================================================================
' | more;} 
 
#ayuda
 if [ "$1" = "" -o "$1" = "-h" -o "$1" = "--help" ]
   then
    ayuda;
    exit 1;
  fi
 
#opciones por omision
 _CONFS="/ruta/a/confs";
 _SID=`egrep "^BD1usuarioA" $_CONFS/sids | cut -d: -f2`;
 _ESP="NO";       #-s
 _DEL="|";     #-d
 _DES="NO";    #-o
 _ORI="NO";
 _tmpF="/tmp/descargaDATOS-sql.sh-`date +%Y%m%d%k%M%S%N`";
 
#leyendo opciones de linea comandos
 while getopts b:o:sd:f: _opciones
  do
   case "$_opciones" in
     f)
       _ORI="$OPTARG";
      ;;
     b)
       _SID=`egrep "^$OPTARG:" $_CONFS/sids | cut -d: -f2`;
       if [ "$_SID" = "" ]
         then
          _SID="$OPTARG";
        fi
      ;;
     o)
       _DES="$OPTARG";
      ;;
     s)
       _ESP="SI";
      ;;
     d)
       _DEL="$OPTARG";
      ;;
     ?)
       ayuda;
       exit 2;
      ;;
    esac
  done
 shift `expr $OPTIND - 1`
 
#sentencia
 if [ $_ORI = "NO" ]
   then
    _query="$1;";
   else
    _query=`cat $_ORI`;
  fi
 if [ "$_DEL" = "NO" ]
   then
    _delimitador="";
   else
    _delimitador="set colsep $_DEL";
  fi
 
#consulta
 echo "--sentencia
       set feedback off
       set verify off
       set heading off
       set tab off
       set pagesize 0
       set lin 10000
       set trim on
       set spa 0
       $_delimitador
 
        $_query
      " | sqlplus -s $_SID > $_tmpF;
egrep "ERROR at|ORA-.*:|SP.+-.*:" $_tmpF >/dev/null
if [ "$?" -ne 1 ]
  then
   echo "descargaDATOS-sql.sh: Error en BD; $_tmpF";
   exit 1;
 fi
 
#espacios de campos
 if [ "$_ESP" != "SI" ]
   then
    cat $_tmpF | sed -e "s/^ *//" -e "s/$_DEL */$_DEL/g" -e "s/ *$_DEL/$_DEL/g" -e "s/ *$//" > $_tmpF-tmp;
    mv $_tmpF-tmp $_tmpF;
  fi
 
#archivo o pantalla
 if [ "$_DES" = "NO" ]
   then
    cat $_tmpF;
#    rm $_tmpF
   else
    mv $_tmpF $_DES
  fi
 
#"Hombres haga, quien quiera hacer pueblos" Jose Marti
 exit 0;

El archivo de sids contiene

$ cat sids
BD1usuarioA:usuarioA/password@BD1
BD2usuarioB:usuarioB/password@BD2

Y muchas gracias POP por La Cofradía recargada

4 thoughts on “(script) Descarga de información de BD”

  1. Todo esto de los scripcitos y demás trozos de código esta muy bien, pero hay algo que no me gusta. Por el formato de cofradía con el tiempo se van a ir perdiendo estos post.

    También sólo funcionan para cierta versión del software. Eso debería indicarse, no es bueno perder el tiempo en probar algo que postearon hace años pero que ya no funciona con versiones más recientes del software. Por ejemplo en este script no dice para qué versión de windows es.

    Otra cosa es que si yo ando buscando algo así ¿cómo se supone que lo encuentre fácilmente? ¿sólo por las palabras clave? en mi opinión esto debería agruparse por categorías, pero algo más ordenado que con las etiquetas como se tiene actualmente.

Leave a Reply