Ir al contenido principal

Sustitución Amspersand Doble ok


Hay ocasiones cuando una sustitución de variable es referenciada múltiples veces en la misma sentencia. En tales situaciones, el servidor Oracle solicitará ingresar un valor para cada ocurrencia de la variable de sustitución con amspersand simple, esto puede ser ineficiente en un query muy complejo.

Ejemplo:

-- ESQUEMA HR
-- REGIONS LOCATIONS DEPARTMENTS COUNTRIES JOB_HISTORY EMPLOYEES JOBS
SELECT &col1, first_name, last_name, phone_number
FROM   employees
WHERE  first_name LIKE '%&filtro%' ORDER BY &col1;

La aparición de la variable ocurre varias veces pero aplica en diferentes clausulas. La captura del mismo valor para una variable es ineficiente. Y otro error que puede surgir son los errores de tipografía. Puede ser que en la segunda escribamos otro valor.  Oracle no ofrece la verificación del valor ingresado aun que tenga el mismo nombre de variable.
Algo que podemos mirar cuando repetimos una columna en la clausula SELECT es que Oracle las enumera.

Ejemplo:

-- ESQUEMA HR
-- REGIONS LOCATIONS DEPARTMENTS COUNTRIES JOB_HISTORY EMPLOYEES JOBS
SELECT &col_order, job_title, min_salary, max_salary
FROM   jobs
WHERE  &col_condicion >= &valor
ORDER BY &col_order;

En situaciones cuando una sustitución de variable es referenciada muchas veces y necesitamos que la variable tenga el mismo valor en todas las ocurrencias dentro de la sentencia, es preferible utilizar las sustitución amspersand doble. Como hacerlo? Lo que debemos realizar es que a la primera variable de las múltiples que aparecen en la sentencia, en lugar de colocarle un amspersand debemos ponerle dos. Cuando Oracle encuentra una variable de sustitución con amspersand doble, una variable sesión es definida para esa variable, usted solo ingresará solo una vez el valor para esa variable. El valor para las siguientes apariciones de la variable será resuelto con la variable sesión. Esta variable permanecerá en sesión. Y si intentas ejecutar nuevamente una consulta con una variable de sustitución que ya fue definida, el cliente sql ya no te pedirá el valor para esa variable ya que se encuentra en sesión y la resuelve con el valor de sesión.
Las variables de sustitución doble se almacenan en la sesión y ahí permanecerán hasta que la sesión sea terminada de cualquier forma. Para eliminarla debemos utilizar el comando de control UNDEFINE el cual se describirá posteriormente.

Ejemplos:

-- ESQUEMA HR
-- REGIONS LOCATIONS DEPARTMENTS COUNTRIES JOB_HISTORY EMPLOYEES JOBS
SELECT employee_id, first_name, last_name, email, phone_number, hire_date
FROM employees
WHERE first_name LIKE '%&busqueda%'
      OR last_name LIKE '%&busqueda%';
     
SELECT employee_id, first_name, last_name, email, phone_number, hire_date
FROM employees
WHERE first_name LIKE '%&&busqueda%'
      OR last_name LIKE '%&busqueda%';

-- ESQUEMA HR
-- REGIONS LOCATIONS DEPARTMENTS COUNTRIES JOB_HISTORY EMPLOYEES JOBS
SELECT location_id, street_address, postal_code, city, state_province, country_id
FROM locations
WHERE street_address LIKE '%&&texto%'
ORDER BY location_id;

undefine texto;

Comentarios