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$
[…] Consulta de Oracle almacenando el resultado en un Array […]
tienes algún tipo de documentación para llamar a un procedure que retorne más de un valor. Y rescatarlos adecuadamente?
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.
si, por favor.
Ok, cuando me lo anoto en mi //TODO particular y cuando tenga un rato escribimos un articulo de Oracle, SQLPlus y PLSQL.
[…] 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 […]
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 ..