jump to navigation

Shell Script – Consulta de Oracle almacenando el resultado en un Array Abril 25, 2007

Posted by superpiwi in Java, Oracle, Programacion, Unix.
trackback

Aqui un pequeño script que uso cuando realizo una consulta a Oracle y quiero guardar los resultados de la consulta en un Array de variables de un Shell Script para su posterior tratamiento.

consulta.sh


#!/bin/bash
#------------------------------------------------------------------------------
# EJEMPLO EN SHELL SCRIPT DE CONSULTA A ORACLE DEVOLVIENDO RESULTADO EN UN
# ARRAY DE VARIABLES
#
# @author
# @revision 10 Ago 2006
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# read_sql_stmt
#
# la funcion empleada para conectar a oracle y ejecutar la consulta
# @param stmt la sentencia SQL a ejecutar
# @param login la cadena de conexion a la base de datos en formato usuario/password@SID
#------------------------------------------------------------------------------
read_sql_stmt() {
typeset stmt=$1
typeset login=$2
echo "
set feedback off verify off heading off pagesize 0
$stmt;
exit
" | sqlplus -s $login
}
#------------------------------------------------------------------------------
echo "[ ->COMIENZO<- ]"
ORACLE_HOME=/usr/lib/oracle/10.2.0.3/client
PATH=$ORACLE_HOME/bin:$PATH
LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
#No es necesario especificar TNS_ADMIN ya apunta por defecto
#TNS_ADMIN=$ORACLE_HOME/network/admin
export ORACLE_HOME
export PATH
export LD_LIBRARY_PATH
#
# En este ejemplo hacemos un select recorremos los resultados y los devolvemos
# en un array de variables compuesta por cadenas separadas por el token ","
# La consulta es sobre una tabla de ORACLE de mi modelo datos, cambia la sentencia
# SQL por la que utilices
#
CADENA_CONEXION="desa/desa@DESARROLLO"
export CADENA_CONEXION
echo "CADENA CONEXION $CADENA_CONEXION"
# Ejecutamos la consulta y devolvemos la fila de resultados en un ARRAY
# NOTA: aqui hay 2 columnas y hacemos un read $var1 $var2, si hubiera mas columnas deberias añadir mas variables de control $varN
ARRAY_1=(`read_sql_stmt "select login,password from STCORE_USER" $CADENA_CONEXION | while read var1 var2
do
#echo "$i||$n"
#exho "$i:$n"
#echo "$i\"$n"
#para el ejemplo tokenizamos las columnas separandolas con | y repitiendo la primera en la tercera
#echo "$i|$n|$i"
echo "login:{$var1},password:{$var2},$var1"
done`)
# Recorrer Todos, Recorremos el Array y generamos una traza de ejemplo que nos interese
echo "[ Procesar todos ]:"
for i in ${ARRAY_1[@]}; do
echo "__RESPUESTA__|Query1_Login|$i" >> consulta.log
done
cat ./consulta.log
rm ./consulta.log
# Otra forma de recorrer todos
# puede emplearse * en lugar de @
echo ""
echo "[ Otra forma de Todos ]:"
echo ${ARRAY_1[*]}
# Contar el numero de elementos
# (Loop until we find an empty string.)
count=0
while [ "x${ARRAY_1[count]}" != "x" ]
do
count=$(( $count + 1 ))
done
echo ""
echo "[ Numero de elementos del Array ]:"
echo "Hay $count Elementos en el array"
echo ""
echo "[ Consulta de elementos del array por el indice ]:"
echo "El Primero es: ${ARRAY_1[0]}"
echo "0 OK"
echo "[ FIN ]"

El shell script esta comentado con lo que facilmente puedes adaptarlo a tus propias consultas.

Realmente estoy realizando una consulta por los campos “login” y “password” de una tabla denominada “STCORE_USER” y al final genero un fichero con este formato:

__RESPUESTA__|Query1.login|login:{aqui la primera columna},password:{aqui la segunda},primera_columna

Al ejecutarlo en mi caso tengo un output como este:

jose@soledad:~/Desktop$ ./consulta.sh
[ ->COMIENZO<- ]
CADENA CONEXION desa/desa@DESARROLLO
[ Procesar todos ]:
__RESPUESTA__|Query1_Login|login:{admin},password:{admin},admin
__RESPUESTA__|Query1_Login|login:{test},password:{test},test
[ Otra forma de Todos ]:
login:{admin},password:{admin},admin login:{test},password:{test},test
[ Numero de elementos del Array ]:
Hay 2 Elementos en el array
[ Consulta de elementos del array por el indice ]:
El Primero es: login:{admin},password:{admin},admin
0 OK
[ FIN ]
jose@soledad:~/Desktop$

Comentarios»

1. Shell Scrript - Consulta de Oracle almacenando el resultado en un Array « Ubuntu Life - Abril 25, 2007

[...] Consulta de Oracle almacenando el resultado en un Array [...]

2. racuna - Mayo 16, 2007

tienes algún tipo de documentación para llamar a un procedure que retorne más de un valor. Y rescatarlos adecuadamente?

3. superpiwi - Mayo 16, 2007

Hay una solucion un poco “burda” que es enviar la salida del sqlplus a un fichero y luego postprocesarlo con comandos del tipo grep, awk, etc… si te interesa comento un dia el tema.

4. racuna - Mayo 16, 2007

si, por favor.

5. superpiwi - Mayo 17, 2007

Ok, cuando me lo anoto en mi //TODO particular y cuando tenga un rato escribimos un articulo de Oracle, SQLPlus y PLSQL.

6. Ejecutar SQL*PLUS desde Shell Script « Ubuntu Life - Octubre 11, 2008

[...] 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 [...]