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