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.




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;