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