Si sabes cómo se debe usar la cláusula UNION del comando SELECT en las consultas a la Base de Datos en tus PL-SQL Procedures en Oracle, podrás construir en una sola query todos los datos que obtengas de distintas fuentes de datos. Muchas veces ocurre que en una consulta SELECT en los PL-SQL Procedures en Oracle se deben traer datos de distintas fuentes pero que están relacionados de una u otra forma.
Muchos desarrolladores optan por construir querys separadas para traer los datos de cada una de las fuentes en los PL-SQL Procedures en Oracle, pero esa forma de construir no es la más óptima ya que te tomará mucho más tiempo hacer las cosas por separado resultando un proceso ineficiente.
Para solucionar este problema Oracle provee la cláusula UNION en el comando SELECT la que permite unir una o varias querys en una sola consulta a la Base de Datos lo que resulta ser muy eficiente ya que solo se debe procesar una sola vez la consulta en tus PL-SQL Procedures en Oracle.
La cláusula UNION por si sola permite unificar los datos al unir las querys, es decir, si la primera query trae una fila de datos que también existe en la segunda query solo se muestra la primera y no ambas, evitando así que se muestren datos repetidos en tus PL-SQL Procedures en Oracle. UNION también cuenta con la variante ALL la que realiza el efecto contrario de usar solo UNION, es decir, permite mostrar todas las filas de todas las querys aunque se encuentren duplicadas en tus PL-SQL Procedures en Oracle. Revisemos un ejemplo que permita entender mejor como usar la cláusula UNION en tus PL-SQL Procedures en Oracle.
Ejemplo #1: Supone que debes mostrar todos los empleados de un departamento que tengan de 21 hasta 25 años que sean solteros, que tengan 26 hasta 30 años que estén casados y los que tengan más 30 que estén solteros o casados. Si te das cuenta esta consulta no se puede hacer en una sola query ya que se deben realizar filtros distintos para cada una, veamos cómo se hace esta consulta:
TÚ REPORTE: “Cómo Construir un SELECT Eficiente en ORACLE en Solo 7 Pasos”
/* PL-SQL Procedures en Oracle */
Select
Dep.nombre_dep,
Emp.nombre_emp,
Emp.edad,
Decode(Emp.estado_civil,1,’Soltero’,2,’Casado’) estado_civil
From tb_empleado emp, t_departamento dep
Where dep.id_departamento = pin_id_departamento
And emp.id_empleado = dep.id_empleado
And emp.edad between 21 and 25
And emp.estado_civil = 1 –1= soltero
UNION /* PL-SQL Procedures en Oracle */
Select
Dep.nombre_dep,
Emp.nombre_emp,
Emp.edad,
Decode(Emp.estado_civil,1,’Soltero’,2,’Casado’) estado_civil
From tb_empleado emp, t_departamento dep
Where dep.id_departamento = pin_id_departamento
And emp.id_empleado = dep.id_empleado
And emp.edad between 26 and 30
And emp.estado_civil = 2 –2= Casado
UNION ALL /* PL-SQL Procedures en Oracle */
Select
Dep.nombre_dep,
Emp.nombre_emp,
Emp.edad,
Decode(Emp.estado_civil,1,’Soltero’,2,’Casado’) estado_civil
From tb_empleado emp, t_departamento dep
Where dep.id_departamento = pin_id_departamento
And emp.id_empleado = dep.id_empleado
And emp.edad > 30
And emp.estado_civil in (1,2) –1= Soltero, 2= Casado;
En este ejemplo se están uniendo 3 querys con la cláusula UNION, cada query tiene filtros diferentes, pero están mostrando los mismos campos como salida, para que las querys se unan correctamente deben tener los mismos campos de salida en el mismo orden y del mismo tipo de dato en tus PL-SQL Procedures en Oracle, de lo contrario Oracle generará un error al compilar o en tiempo de ejecución. Fíjate que en la última query use el UNION ALL para indicar que se muestren todas las filas de la consulta aunque existan en las querys anteriores.
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”
muy didactico ,usas un lenguaje que se entiende en una sola leida,sigue asi
Hola Jhon, gracias por comunicarte y por tu excelente comentario, seguire creando artículos y videos con mucha información valiosa para los lectores, gracias.
PD: Ya obtuviste mi reporte gratuito sobre “Como Construir un SELECT Eficiente en Oracle en Solo 7 Pasos”, si aún no lo has hecho puedes obtenerlo desde aquí:
https://dominatuspackagesen0racle.com
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
Gracias por compartir tu conocimiento con personas que queremos aprender.
Me gusto tu explicacion, corta, consisa y clara.
Hola Carlos, gracias por comunicarte y por tu excelente comentario, me da mucho gusto que la información se sea de utilidad y te invito a que compartas este enlace https://dominatuspackagesen0racle.com/ con tus amigos o personas que también les pueda interesar esta información, gracias.
Saludos
Roberto Vicencio – Para Tu Éxito on Oracle.
https://dominatuspackagesen0racle.com/
Estoy construyendo un SP en Oracle que une dos query’s con UNION y recorro el resultado con un cursor, pero me marca una error: PLS-00103: Encontró el símbolo “SELECT” cuando se esperaba una de las siguentes
Hola Magali, gracias por comunicarte, ese error se debe a que tienes un problema en la sintaxis del Select, fíjate muy bien en que no te falte o te sobre alguna coma ‘,’, punto y coma ‘;’, etc.
PD: Ya obtuviste mi libro-reporte sobre “Cómo Construir un SELECT Eficiente en Oracle en Solo 7 Pasos”, si aun no lo tienes puedes obtenerlo desde este enlace: https://dominatuspackagesen0racle.com/, gracias.
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
Hola nuevamente dando lata, ahora con un cursor. Tengo este sp y dependiendo de la cadena que le pases te da uno u otro formato de fecha, el caso es que si le pasas ‘101’ te manda 11/10/2014 si le mando cualquiera de los otros dos formatos, osea ‘112’ o ‘103’ no muestra nada y manda el error de cursor is closed, ayuda porfaa
PROCEDURE sp_ObtieneFechaServidor
(
v_pe_FormatoFecha IN VARCHAR2,
cv_1 OUT SYS_REFCURSOR,
cv_2 OUT SYS_REFCURSOR,
cv_3 OUT SYS_REFCURSOR
)
AS
BEGIN
IF v_pe_FormatoFecha = ‘103’ THEN
BEGIN
OPEN cv_1 FOR
SELECT TO_CHAR(SYSTIMESTAMP,’DD/MM/YYYY’)
FROM DUAL ;
END;
END IF;
IF v_pe_FormatoFecha = ‘112’ THEN
BEGIN
OPEN cv_2 FOR
SELECT TO_CHAR(SYSTIMESTAMP,’YYYYMMDD’)
FROM DUAL ;
END;
END IF;
IF v_pe_FormatoFecha = ‘101’ THEN
BEGIN
OPEN cv_3 FOR
SELECT TO_CHAR(SYSTIMESTAMP,’MM/DD/YYYY’ )
FROM DUAL ;
END;
END IF;
END;
Que tal Magali, gracias por comunicarte, ese error ocurre porque tienes 3 cursores pero en cada llamada solo abres uno, veo que en cada cursor estas obteniendo siempre una fecha, por lo que te recomiendo que solo uses un solo cursor para cada caso y no tres, por ejemplo usa el cv_1 en los tres casos, gracias.
PD: Si te ha gustado este blog te invito a que compartas el enlace https://dominatuspackagesen0racle.com/ con tus amigos o personas que también les pueda interesar esta información.
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
Buenas tardes, pues aqui con un nuevo problema, resulta que tengo un procedimiento almacenado en oracle, y me lo han dado para optimizar su rendimiento, asi que lo he reescrito por completo, ejecutando ambos con los mismos parámetros de entrada, su velocidad a mejorado bastante. Mi pregunta es: ¿Existe una herramienta que pudiera utilizar para determinar cual es mejor? he intentado con explain plan pero solo funciona para consultas no para codigo pl/sql o sp´s completos, alguna sugerencia? todo es bienvenido. De antemano muchas gracias
Hola Magali, no conozco una herramienta en Oracle que permita optimizar código pl/sql, generalmente son las querys las que bajan el rendimiento de los procesos y explain plan es una buena herramienta para usar, reescribir el código es una buena técnica ya que te permite detectar código redundante, repetitivo o innecesario.
PD: Si te ha gustado el blog te invito a compartir el enlace https://dominatuspackagesen0racle.com/ con tus amigos o personas que también les pueda ser útil este contenido, gracias.
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
Hola Roberto. Sabes, llevo meses tratando de sacar un ejercicio que me han pedido en la universidad. Me pregunto si podrías echarme una mano. Saludos y muchas gracias por compartir tus conocimientos.