Saber usar eficientemente la cláusula IN te permitirá reducir la cantidad de código que escribas y además tener un código más legible que sea entendible por cualquier desarrollador en tus PL-SQL Procedures en Oracle.
La cláusula IN permite agrupar en un solo lugar dos o más códigos que hacen referencia a un mismo tipo de dato, eliminando así la cláusula OR en las condiciones del WHERE, del IF, del CASE, del WHILE, entre otros en tus PL-SQL Procedures en Oracle.
Revisemos algunos ejemplos prácticos que te permitan entender mejor como usar la cláusula IN en tus PL-SQL Procedures en Oracle.
Ejemplo #1: Supone que debes construir una condición en un IF donde una variable puede tomar varios valores diferentes, veamos la forma tradicional y la forma usando el IN:
Forma Tradicional.
/* PL-SQL Procedures en Oracle */
If lst_estado_civil = ‘SOLTERO’ or lst_estado_civil = ‘SEPARADO’ or lst_estado_civil = ‘VIUDO’ then
<acción a realizar>
End if;
En este ejemplo de PL-SQL Procedures en Oracle se está usando el OR para separar cada valor que puede tomar la variable lst_estado_civil.
Forma usando el IN.
/* PL-SQL Procedures en Oracle */
If lst_estado_civil IN (‘SOLTERO’, ‘SEPARADO’, ‘VIUDO’) then
<acción a realizar>
End if;
En este ejemplo de PL-SQL Procedures en Oracle se reemplaza el OR por un IN agrupando los distintos valores dentro de un paréntesis, lo que resulta ser más eficiente y ordenado.
TÚ REPORTE: “Cómo Construir un SELECT Eficiente en ORACLE en Solo 7 Pasos”
Ejemplo #2: Veamos cómo se usa el IN en una consulta SELECT.
Forma Tradicional.
/* PL-SQL Procedures en Oracle */
Select emp.nombre_emp, emp.rut, emp.dv from t_empleado emp
where emp.id_estado_civil = 1 -– SOLTERO
or emp.estado_civil = 3 -– SEPARADO
or emp.estado_civil = 4; -– VIUDO
En este ejemplo de PL-SQL Procedures en Oracle se está usando un OR para cada valor del campo emp.estado_civil.
Forma usando el IN.
/* PL-SQL Procedures en Oracle */
Select emp.nombre_emp, emp.rut, emp.dv from t_empleado emp where emp.id_estado_civil IN ( 1, — SOLTERO
3, — SEPARADO
4 — VIUDO
);
En este ejemplo se usa el IN para reemplazar el OR en tus PL-SQL Procedures en Oracle.
En un SELECT también puedes hacer esto:
/* PL-SQL Procedures en Oracle */
Select emp.nombre_emp, emp.rut, emp.dv from t_empleado emp where emp.id_estado_civil IN (select civ.id_estado_civil from t_estado_civil civ where civ.nom_estado_civil <> ‘CASADO’);
En este ejemplo se usa el IN obteniendo los id_estado_civil desde otra consulta Select en tus PL-SQL Procedures en Oracle.
Te propongo que pruebes de inmediato este ejemplo en tu Base de Datos con tus propios PL-SQL Procedures en Oracle y PL-SQL Function en Oracle, para que comiences a ejercitar la mano y aprendas a dominar esta nueva técnica en tus PL-SQL Packages en Oracle.
Estoy muy interesado en conocer tu opinión y/o comentario sobre este artículo, también cuéntame sobre qué es lo que quieres saber de PL-SQL Procedures en Oracle y/o dime cuál es tu principal frustración a la hora de trabajar con PL-SQL Procedures en Oracle. Estaré muy atento respondiendo tus preguntas y/o comentarios, gracias.
Saludos
Roberto Vicencio – Escritor del Reporte:
“Cómo Construir un SELECT Eficiente en ORACLE en Solo 7 Pasos”
Por favor quisiera saber como usar el not in, ya que mi procedimiento se trata de recibir un parametro y verificar si no esta en una tabla…si eso pasa entonces lo inserta sino no hace nada o que devuelva un mensaje diciendo tal parametro ya existe…por favor es urgenteee
Hola Nury, gracias por comunicarte, para lo que quieres hacer talvez no necesitas usar el NOT IN, solo debes hacer un SELECT para buscar el parámetro en tu tabla y si no lo encuentras lo insertas, mira este ejemplo:
procedure tu_proceso(pin_tu_parametro in number, pst_mensaje out varchar2) is
begin
begin
select tu_id
into lin_tu_id
from tu_tabla
where tu_campo = pin_tu_parametro;
exception
when no_data_found then
lin_tu_id:= null;
end;
if lin_tu_id is null then
insert into tu_tabla(tu_campo, …) values(tu_parametro, …);
else
pst_mensaje:= ‘Parámetro ya existe’;
end if;
end tu_proceso;
La solución es mas simple de lo que pensabas, espero te sirva.
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle
PD: ¿Ya obtuviste mi reporte gratuito de “Cómo Construir un Select Eficiente en Oracle en Solo 7 Pasos”?, suscríbete aquí:
https://dominatuspackagesen0racle.com/blog
Hola quisiera saber si me pudieras ayudar.
hago una consulta, y el resultado lo concateno, en una variable tipo varchar, para enviarlo como parametro en el IN,
la variable tiene este formato
SELECT LISTAGG (A.TRANSACCIONID,’,’) WITHIN GROUP (ORDER BY A.TRANSACCIONID) INTO LISTA
FROM TRANSACCION A
INNER JOIN CONTRATO B ON B.CONTRATOID = A.CONTRATOID
WHERE A.NOMBRE LIKE ‘%_INY’
AND A.CONTRATOID IN (CONTRATO);
dbms_output.Put_line(LIST_TRANS_INY);
OPEN cINY FOR
SELECT A.NOMBRE
FROM TRANSACCION A
INNER JOIN CONTRATO B ON B.CONTRATOID = A.CONTRATOID
–WHERE A.NOMBRE LIKE ‘%_INY’
–WHERE A.CONTRATOID IN (23)
WHERE A.TRANSACCIONID IN (LISTA)
ORDER BY A.TRANSACCIONID;
PERO CUANDO LO EJECIUTO ME DICE QUE EL NUMERO NO ES VALIDO, SI LISTA TIENE MAS DE UN NUMERO EJ (LISTA= 12,54,25,4) PERO SI SOLO TIENE UNO, LO EJECUTA SIN PROBLEMA.
GRACIAS!!! URGENTE 🙁
Hola Samantha, gracias por comunicarte, no puedes usar una cadena de texto para colocar valores en un in, lo que debes hacer es colocar tu primera query dentro del in de la segunda query, algo como lo siguiente:
WHERE A.TRANSACCIONID IN (SELECT distinct A.TRANSACCIONID
FROM TRANSACCION A
INNER JOIN CONTRATO B ON B.CONTRATOID = A.CONTRATOID
WHERE A.NOMBRE LIKE ‘%_INY’
AND A.CONTRATOID IN (CONTRATO) )
PD: Ya pudiste ver mi libro reporte sobre ‘Cómo Crear un SELECT Eficiente en ORACLE en Solo 7 Pasos’, si aun no lo tienes en tus manos puedes obtenerlo gratis desde aquí: https://dominatuspackagesen0racle.com/
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
Hola
queria saber como se haria para recibir como parametro una coleccion o un arreglo en un procedimiento almacenado q contenga los valores q pasaria a un IN en un query.
de antemano muchas gracias por la ayuda.
Saludos!