Está en la página 1de 3

VARIABLES DE ENLACE (BIND)

Las etapas involucradas en la ejecucin de una sentencia SQL

(PARSE,BIND, EXECUTE y FETCH)


PARSE : Busca la sentencia en la shared pool
Chequea que la sintaxis respete la gramtica y especificaciones del
lenguaje SQL
Chequea la semntica, asegurando que los objetos referenciados sean
vlidos y satisfagan las restricciones de seguridad
Determina que el proceso que ejecuta la sentencia tenga los privilegios
apropiados.
BIND: En la fase de binding Oracle verifica la sentencia buscando
referencias a variables de binding (bind variables).
Luego Oracle asigna los valores a cada una de las variables. Ntese que
el plan de ejecucin se resolvi en la etapa
anterior y por lo tanto Oracle no saba los valores de las variables en el
momento en que selecciono el plan de ejecucin.
Este orden en las etapas de resolucin de una sentencia hace que sea
imposible para el optimizador estimar la selectividad
del predicado.
EXECUTE: En la etapa de ejecucin Oracle aplica el plan de ejecucin
determinado en la etapa de parseo y ejecuta las lecturas fsicas, lgicas
y ordenamientos necesarios.
Es interesante destacar una sutil diferencia entre ordenamientos para
sentencias de modificacin de datos (insert, update,
delete) y sentencias de consulta.
FECH: En la etapa de fetch, Oracle recupera las filas de una sentencia
SELECT. Normalmente cada fetch recupera mltiples filas
utilizando un arreglo de fetch o array fetch.
Cuando el binding se hace por valor se debe proveer el valor de todas
las variables que estn en la sentencia SQL antes de cada ejecucin.
Cuando el binding es por referencia, se utilizan las direcciones de
memoria de las variables con los valores reales.
ENLACES

https://sqleficiente.wordpress.com/2009/07/01/variables-debinding-bind-variables/
https://www.youtube.com/watch?v=vZWgUWaHJ38

Variables de Enlace (Bind)


Son variables de SQL*Plus.
Las pueden referenciar bloques de PL/SQL mediante el uso del ampersand
(&).
Ejemplo:

--Ahora realizamos el ejemplo usando variables bind


---------------------------------------------------------------alter system flush shared_pool;
Sistema modificado.
alter system flush buffer_cache;
Sistema modificado.
declare
ln_cantidad number;
begin
for n_ind in 1..10000 loop
--:ID_PERSONA es la variable bind que se reemplazar
--por lo que venga en la seccin de USING
execute immediate 'select count(*) from cl_personas
where id_persona= :ID_PERSONA'into ln_cantidad using n_ind ;
end loop;
end;
/

Procedimiento PL/SQL terminado correctamente.


Transcurrido: 00:00:01.03
--Revisamos en el SQL AREA la cantidad de sentencias
--que se generaron
select count(*)cantidad from v$sql where sql_text
like 'select count(*) from cl_personas where id_persona=%';
CANTIDAD
---------1