Mostrando entradas con la etiqueta Unix shell scripts. Mostrar todas las entradas
Mostrando entradas con la etiqueta Unix shell scripts. Mostrar todas las entradas

viernes, 2 de noviembre de 2007

Variables de ambiente, binds y sqlplus

Queremos realizar múltiples ejecuciones de un Unix shell script que a su vez ejecuta una sentencia SQL. Deseamos facilitar la reutilización de recursos de la base de datos asociados a la sentencia SQL y lograr una performance de ejecución razonable.

Los valores variables de la cláusula WHERE que utilizamos para filtrar las filas seleccionadas los representamos con bind variables o variables de enlace. Es importante no utilizar valores fijos en lugar de variables. De esta manera facilitamos al motor de base de datos el reconocimiento de la múltiple ejecución de la misma sentencia SQL con distintas condiciones y podrá reutilizar recursos asignados en la primera ejecución de la sentencia y saltear algunos pasos en las ejecuciones siguientes.

Listamos el fichero que contiene el shell script (comando ls) y mostramos el contenido (comando cat).
Utilizamos dos variables de shell (shell_usuario y shell_numero) y asignamos su contenido a dos variables de sqlplus (sql_usuario y sql_numero) mediante el comando EXECUTE.
Luego ejecutamos la sentencia SQL utilizando las dos variables de sqlplus precedidas por dos puntos, es decir, bind variables.

monitor@DESA] $ ls -l consulta5.sh
-rwxr-xr-x 1 monitor dba 356 Nov 2 18:09 consulta5.sh

[monitor@DESA] $ cat consulta5.sh
#!/bin/ksh

shell_usuario=SYS
shell_numero=0

sqlplus -s monitor/monitor <<FIN_SQL

VARIABLE sql_usuario VARCHAR2(30)
VARIABLE sql_numero NUMBER

EXECUTE :sql_usuario := '${shell_usuario}'
EXECUTE :sql_numero := ${shell_numero}

SELECT USERNAME, USER_ID, CREATED
FROM ALL_USERS
WHERE USERNAME = :sql_usuario
AND USER_ID = :sql_numero
/
FIN_SQL
Ejecutamos el shell script, que ejecuta el sqlplus que realiza las dos asignaciones de variables y ejecuta la sentencia SQL. Muestra el resultado de la sentencia SQL en pantalla.

monitor@DESA] $ consulta5.sh

PL/SQL procedure successfully completed.


PL/SQL procedure successfully completed.


USERNAME USER_ID CREATED
------------------------------ ---------- ----------
SYS 0 12/05/2002
Podemos leer este tema en la documentación estandar de Oracle:

Manual: SQL*Plus User's Guide and Reference
Capítulo: 5 Using Scripts in SQL*Plus
Título: Using Bind Variables

jueves, 25 de octubre de 2007

Unix shell script para Oracle (IV)

Necesitamos determinar en el shell script si la sentencia SQL ejecutada tuvo errores. Debemos evaluar el valor de retorno del sqlplus luego de ejecutar la sentencia para saber se generaron errores.
Cada comando que ejecutamos devuelve al terminar un valor de retorno que es recibido por el Korn shell. Por ejemplo al ejecutar el comando ls para saber si la carpeta actual contiene el fichero de nombre fichero_inexistente.txt.

[monitor@DESA] $ ls fichero_inexistente.txt
fichero_inexistente.txt: No such file or directory
La variable de ambiente $? nos muestra el valor retornado por el último comando ejecutado. Si el valor o estado de retorno es 0 (cero) la ejecución fue exitosa y un valor distinto de cero representa un error de ejecución. En este caso el comando ls no encontró ficheros con el nombre fichero_inexistente.txt por lo tanto retornó un valor distinto de 0 (cero).

[monitor@DESA] $ echo $?
2
La carpeta actual contiene un fichero de nombre fichero_xx.txt por lo tanto la ejecución del comando ls es exitosa y el estado de retorno del último comando ejecutado reflejado en la variable de ambiente $? es 0 (cero).

[monitor@DESA] $ ls fichero_xx.txt
fichero_xx.txt
Verificamos el valor de retorno del comando ls.
[monitor@DESA] $ echo $?
0
Para consultar la base de datos utilizaremos dos scripts denominados consulta3.sh y consulta4.sh.

[monitor@DESA] $ ls -l consulta3.sh consulta4.sh
-rwxrwxrwx 1 monitor dba 178 Oct 25 15:30 consulta3.sh
-rwxrwxrwx 1 monitor dba 168 Oct 25 15:30 consulta4.sh
Agregamos la línea WHENEVER SQLERROR EXIT SQL.SQLCODE para indicar al sqlplus que en caso de producirse un error de SQL como consultar una tabla inexistente debe terminar la ejecución y retornar el código de error asociado. De esta forma el Korn shell recibe el código de error del sqlplus y puede ser consultado en la variable de ambiente $?. Luego en el shell script podemos programar acciones correctivas en caso de detectarse un error en la ejecución de la sentencia SQL.

[monitor@DESA] $ cat consulta3.sh
#!/bin/ksh

sqlplus -s monitor/colopass07 <<FIN
WHENEVER SQLERROR EXIT SQL.SQLCODE
SELECT 1 AS COLUMNA FROM DUAL_NO_EXISTE
/
FIN

echo 'consulta3.sh EL VALOR DE RETORNO $? ES ' $?
Ejecutamos el shell script consulta3.sh y vemos el código de error que el envía el sqlplus:
[monitor@DESA] $ consulta3.sh
SELECT 1 AS COLUMNA FROM DUAL_NO_EXISTE
*
ERROR at line 1:
ORA-00942: table or view does not exist

consulta3.sh EL VALOR DE RETORNO $? ES 174
Si la ejecución del sqlplus no produce errores el código de retorno es cero o ejecución exitosa. Así lo podemos ver en el ejemplo de ejecución de consulta4.sh donde la variable de ambiente $? toma el valor 0 (cero) luego de la ejecución del sqlplus.

[monitor@DESA] $ cat consulta4.sh
#!/bin/ksh

sqlplus -s monitor/colopass07<<FIN
WHENEVER SQLERROR EXIT SQL.SQLCODE
SELECT 1 AS COLUMNA FROM DUAL
/
FIN

echo 'consulta4.sh EL VALOR DE RETORNO $? ES ' $?
Ejecutamos el shell script consulta4.sh y vemos el código de error que envía el sqlplus:
[monitor@DESA] $ consulta4.sh

COLUMNA
----------
1

consulta4.sh EL VALOR DE RETORNO $? ES 0
Podemos leer este tema en la documentación estandar de Oracle:

Manual: SQL*Plus User's Guide and Reference
Capítulo: 12 SQL*Plus Command Reference
Párrafo: WHENEVER SQLERROR
Párrafo: EXIT

domingo, 21 de octubre de 2007

Unix shell script para Oracle SQL (III)

Podemos ejecutar una sentencia SQL embebida en el shell script, es decir, script y SQL todo en el mismo fichero.
Listemos el archivo de prueba llamado consulta2.sh.

[monitor@DESA]ls -l consulta2.sh
-rwxrw-r-- 1 monitor dba 69 Aug 14 12:20 consulta2.sh

Veamos el contenido del fichero que contiene el shell script. Observamos que llamada al ejecutable sqlplus monitor/colopass07 es seguida por la cadena <<FIN, la sentencia SQL y la cadena FIN. El texto encerrado entre estas dos cadenas será recibido por el fichero ejecutable por la entrada estandar (stdin).
Los primeros dos caracteres del shell script (#!) NO son un comentario, se utilizan para indicar que el resto de la línea detalla el interprete de comandos que se debe utilizar para ejecutar el script en este caso el Korn shell o /bin/ksh.

[monitor@DESA]cat consulta2.sh
#!/bin/ksh
#
sqlplus monitor/colopass07 <<FIN
SELECT 1
FROM DUAL
/
FIN

El sqlplus recibe por la entrada estándar la sentencia SQL, la ejecuta y termina la ejecución retornando el control al ksh.

[monitor@DESA]consulta2.sh
SQL*Plus: Release 9.2.0.8.0 - Production on Tue Aug 14 12:21:44 2007
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

Connected to:
Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.8.0 - Production

SQL>
1
----------
1


SQL> Disconnected from Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.8.0 - Production

[monitor@DESA]

sábado, 20 de octubre de 2007

Unix shell script para Oracle SQL (II)

Queremos crear un script para el shell de Unix (podría ser el Korn shell, ksh) ejecute una sentencia SQL y nos muestre los datos en la pantalla.
Simplemente escribimos la instrucción aparecida en la entrada Oracle Database Tutorial: Unix shell script para Oracle SQL (I) en una fichero con extensión ".sh".
Para ello utilizaremos los ficheros llamados sentencia.sql y consulta1.sh.
[monitor@DESA]ls -l sentencia.sql consulta1.sh consulta2.sh
-rwxr--r-- 1 monitor dba 51 Aug 14 12:20 consulta1.sh
-rwxrw-r-- 1 monitor dba 69 Aug 14 12:20 consulta2.sh
-rw-r--r-- 1 monitor dba 29 Aug 14 12:19 sentencia.sql

El fichero sentencia.sql solo contiene la sentencia SQL a ejecutar en la base de datos.
[monitor@DESA]cat sentencia.sql
SELECT 1
FROM DUAL
/
EXIT

El fichero consulta1.sh sólo contiene la llamada a ejecución del SQL*Plus con el usuario monitor, la password colopass07, arroba (@) y el nombre del fichero que contiene la sentencia SQL a ejecutar sentencia.sql (los primeros dos caracteres del shell script (#!) se utilizan para indicar que el resto de la línea detalla el interprete de comandos que se debe utilizar para ejecutar el script en este caso el Korn shell o /bin/ksh).
[monitor@DESA]cat consulta1.sh
#!/bin/ksh

sqlplus monitor/colopass07 @sentencia.sql

Ejecutamos el shell script: se conecta, ejecuta el select, muestra una fila con el valor uno, nombre de la columna uno y se desconecta.
[monitor@DESA]consulta1.sh
SQL*Plus: Release 9.2.0.8.0 - Production on Tue Aug 14 12:21:32 2007
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

Connected to:
Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.8.0 - Production

1
----------
1


Disconnected from Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.8.0 - Production

viernes, 19 de octubre de 2007

Unix shell script para Oracle SQL (I)

Queremos ejecutar una consulta con una sentencia SELECT almacenada en un fichero con extensión .sql en el file system. ¿Cómo ejecutamos la consulta?
Primero, listamos los ficheros a utilizar en el ejemplo y mostramos en la pantalla el contenidos de sentencia.sql.

[monitor@DESA]ls sentencia.sql
sentencia.sql

Podemos ver que el fichero sentencia1.sql sólo contiene una sentencia SELECT 1 FROM DUAL la barra (/) para ejecutarla y el comando EXIT para indicar la salida del SQL*Plus.

[monitor@DESA]cat sentencia.sql
SELECT 1
FROM DUAL
/
EXIT

Para ejecutar este SELECT debemos invocar al SQL*Plus pasándole por parámetro el usuario (monitor) y la password (colopass) para conectarnos y arroba (@) el nombre del fichero (sentencia.sql) que contiene la sentencia SQL. Ejecutamos la línea donde se conecta, ejecuta el select, muestra una fila con el valor uno y se desconecta.

[monitor@DESA]sqlplus monitor/colopass07 @sentencia.sql

SQL*Plus: Release 9.2.0.8.0 - Production on Fri Sep 28 14:16:33 2007
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

Connected to:
Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.8.0 - Production

1
----------
1


Disconnected from Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.8.0 - Production