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 - May 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 - May 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 - May 16, 2007

si, por favor.

5. superpiwi - May 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 […]

7. trexientos - julio 5, 2010

Saludos cordiales a todos..

Soy relativamente nuevo desarrollando en forms 6i, y tengo un requerimiento… Tengo que hacer que un usuario final con conocimientos minimos de PL-SQL pueda hacer una formula, la cual deba de ser corrida por el programa..

Como asi ?

Pues estoy trabajando en un modulo de produccion , y quiero que el usuario defina una formula como la siguiente :
======================================================================
Al Introducir un articulo con las siguientes caracteristicas :
Articulos : 1000. Ventana
Medida :.83
Alto: 1
N.secciones : 2
======================================================================
En ese momento se ejecute una formula para calcular vidrio.
El vidrio solo a manera de ejempo
tendria una formula en la cual se operan matematicamente los valores anteriores y se aplican decisiones, tales como :
======================================================================
var1= 0.018*2
var2 = secciones -1
var3 = 0.03*var2
var4 = 0.005*secciones
var5 = var1 + var3
var6 = (ancho var5) + var4
var7 = var6/secciones
var8 = var7/0.0254
var9 = ceiling(var8)
var10 = var9/2
var11 = ceiling(var10)

If var10var11 Then
var12 = var9 +1
then
var12 = var9
Endif

etc.etc..etc..

El caso es que las formulas llevan mas de 2 condiciones.

Podria alguien sugerirme como guardar en la base de datos
esa formulacion , y luego como ejecutarla desde forms??

Ahora.. no pueden ser funciones, ni procedimientos.. pues el usuario solo las guarda como un registro.. y son invocadas desde la aplicacion..

Supongo que tiene que ser un bloque anonimo.. pero como hago
que el usuario lo edite, y luego lo corra sin compilar??

Es posible ?

Muchas gracias por sus ideas ..


Deja un comentario