Variables de binding (bind variables)

La travesia dificil - Rene Magritte

La travesia dificil - Rene Magritte

A lo largo de los posts acerca del procesamiento de sentencias SQL hemos mencionado las variables de binding, tambien llamadas bind variables. Sin embargo, todavia no hemos dicho de que se tratan especificamente estas bind variables. En este post tratare de aclarar este concepto.

Antes de avanzar especificamente en el concepto de bind variable es importante recordar las etapas involucradas en la ejecucion de una sentencia SQL (parse, bind, execute y fetch) como asi tambien el concepto de cursor. Normalmente el desarrollador hace un uso implicito de los cursores y de las etapas de una sentencia a traves de APIs. Entre las APIs que frecuentemente utilizan los desarrolladores podemos mencionar ODP, JDBC, PL/SQL, etc.

Como dijimos en el post “Como escribir código para compartir cursores“, solamente las sentencias SQL completamente identicas son reconocidas como tales cuando el parser de SQL consulta la library cache en busca de cursores para compartir. En consecuencia las sentencias

select * from empleado where empno=1234
y
select * from empleado where empno=5678

seran consideradas diferentes. Ejecutar estas dos sentencias implicara dos parseos diferentes y dos entradas diferentes en la library cache. Sin embargo, estas sentencias hacen lo mismo; la unica diferencia radica en el valor.

Para evitar estas duplicidades, las aplicaciones deben utilizar algun mecanismo de variables que tome los valores reales en tiempo de ejecucion. La sentencia SQL deberia ser del tipo:

select * from emp where empno=:x

para que pueda ser ejecutada multiples veces con diferentes valores para la variable :x.

Una aplicacion bien diseñada haria un solo parse de esta sentencia y repetiria la ejecucion tantas veces como sea necesario con distintos valores para la variable de bind que utilice en el programa de la aplicacion. Esta forma de programar no solo hace que un simple programa funcione mejor sino que tambien asegura la escalabilidad cuando se ejecuten multiples instancias concurrentes del mismo programa compartiendo el mismo codigo SQL en la library cache. Esta ha sido siempre la recomendacion de Oracle para la programacion de aplicaciones.

Hay dos formas que las diversas APIs (ODBC, JDBC, PL/SQL) utilizan para hacer binding: por valor o por referencia. Cuando el binding se hace por valor se debe proveer el valor de todas las variables que estan en la sentencia SQL antes de cada ejecucion. Cuando el binding es por referencia, se utilizan las direcciones de memoria de las variables con los valores reales.

Anuncios

3 comentarios

  1. tanto he buscado esta respuesta, para que tan solo sea PASAR VALORES VARIABLES EN LA BUSQUEDA DE UN SELECT.

    no sé que diferencia tiene oracle entonces, si todas las BD se puede hacer lo mismo, depende de la habilidad de cada uno nada más.

  2. Las palabras reservadas deben ir en mayúscula para evitar el parsing


Comments RSS TrackBack Identifier URI

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s