Ejecutar SQL*PLUS desde Shell Script

Hace tiempo escribi como ejecutar una consulta con sql*plus desde shell script y cargando los resultados en un array, el cual estaba basado en este articulo.

La idea es simple, ejecutar un sql con sql*plus y cargar las variables de la consulta en un array. Sin embargo este metodo tiene un problema y es cuando la columna contiene espacios. Por ejemplo podria ser un dato del estilo: “Estados Unidos de America”, entonces en el array este dato no se inserta como un unico item sino como cuatro: “Estados”, “Unidos”,”de”,”America”.

-> [UK] <-
-> [United <-
-> Kingdom] <-
-> [US] <-
-> [United <-
-> States <-
-> of <-
-> America] <-
-> [ZM] <-

Asi que ahora os dejo otro ejemplo, en el cual lo que hacemos con la directiva “spool” es guardar el resultado del SQL ejecutado en un fichero, el cual ya podemos tratar posteriormente con utilidades como “grep” o “awk”, por ejemplo, para extraer los datos.

Aqui el script:


#!/bin/bash

#---------------------------------------------------------------------------------
# read_sql
# Funcion para hacer consultas SQLPlus y cargar los valores en variables o Arrays
#---------------------------------------------------------------------------------
read_sql()
{
typeset stmt=$1
typeset login=$2
echo "
set feedback off verify off heading off pagesize 0
$stmt;
exit
" | sqlplus -s $login
}
#----

# ORACLE_SID, y ORACLE_HOME deben estar definidas, carga estas variables segun tu caso
ORACLE_SID="XE"
ORACLE_HOME="/usr/lib/oracle/xe/app/oracle/product/10.2.0/server"
echo "ORACLE_SID=$ORACLE_SID"
echo "ORACLE_HOME=$ORACLE_HOME"

echo "- Init -"
DATOS=(`read_sql "SELECT country_id,trim(country_name) FROM COUNTRIES" "hr/hr@XE" | while read v1 v2
do
echo "[$v1] [$v2]"
done`)

echo "Tras Ejecucion SQLplus mostramos el resultado cargado del array:"
for i in ${DATOS[@]};
do
echo "-> $i <- "
done

# Otro ejemplo, sin cargar resultados en Array sino imprimiendo directamente
# Cuidado con los retornos de carro o el comando dara error de conexion.
read_sql "SELECT trim(country_id),trim(country_name) FROM COUNTRIES" "hr/hr@XE" | while read c n
do
 echo "id es $c , name es '$n'"
done

# Nota: si el campo columna tiene espacios se fastidia el asunto
# Asi que es mejor usar este:
# Guardando la salida a un fichero temporal llamado "output.txt"

sqlplus -s hr/hr@XE <<EOT1 > /dev/null
set feedback off verify off heading off pagesize 0
spool output.txt
SELECT concat(concat(country_id,'|'),country_name) FROM COUNTRIES;
spool off
exit
EOT1

echo "Finalizado";

Como veis lo primero que hacemos con “set feedback off verify off heading off pagesize 0″ es eliminar la cabecera de resultados y paginar para que los datos se vean correctamente.
Despues con “spool” ya guardamos los resultados al fichero indicado.
El resultado de ejecutar el script sera un fichero “output.txt” de la forma:

jose@soledad:~$ cat output.txt
AR|Argentina
AU|Australia
BE|Belgium
BR|Brazil
CA|Canada
CH|Switzerland
CN|China
DE|Germany
DK|Denmark
EG|Egypt
FR|France
HK|HongKong
IL|Israel
IN|India
IT|Italy
JP|Japan
KW|Kuwait
MX|Mexico
NG|Nigeria
NL|Netherlands
SG|Singapore
UK|United Kingdom
US|United States of America
ZM|Zambia
ZW|Zimbabwe

Que ya podemos recorrer y procesar tranquilamente linea por linea.

Enlace | SQL*PLUS referencia (1) y (2)

1 Respuesta a “Ejecutar SQL*PLUS desde Shell Script”


  1. 1 superpiwi Octubre 11, 2008 a las 4:15 pm

    Es:

    sqlplus -s hr/hr@XE <<EOT1 > /dev/null
    set feedback off verify off heading off pagesize 0
    spool output.txt
    SELECT concat(concat(country_id,’|'),country_name) FROM COUNTRIES;
    spool off
    exit
    EOT1

    Que wordpress cambia los > y < por & gt; y & lt;


Escribe un comentario






TRABAJANDO EN EL NUEVO UBUNTU LIFE
Problemas en el servidor, me han obligado a abandonar temporalmente www.ubuntulife.net y ahora escribo solo en ubuntulife.wordpress.com, estoy trabajando en el nuevo sitio y espero añadir novedades. Sugerencias son bienvenidas. ( Lee mas )

WALLPAPERS LIFE ( Muchos fondos de pantalla, aqui )

DESCARGATE SCIFI LIFE

365 Dias de Soledad
Me debes los sueños, las promesas y las noches rotas. Me debes la paz, la sonrisa y la esperanza robadas. Me debes la sangre, las lágrimas y el sudor vertido. Me debes las noches vacías, los abrazos anhelados. Me debes un beso de ajenjo de tu amarga boca.

The Ubuntu Counter Project - user number # 11961
Geo Visitors Map

 

Octubre 2008
L M X J V S D
« Sep   Nov »
 12345
6789101112
13141516171819
20212223242526
2728293031  

Blog Stats

  • 5,226,788 hits