Saltar al contenido

Sepa Utilizar la Cláusula UNION del Comando SELECT en las Querys de PL-SQL Procedures en Oracle

PL-SQL Procedures en OracleSi 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”

¡ Haz Click Aquí y Descárgalo GRATIS Ahora !

/* 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

11 comentarios en «Sepa Utilizar la Cláusula UNION del Comando SELECT en las Querys de PL-SQL Procedures en Oracle»

    1. 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.

  1. 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

    1. 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.

  2. 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;

    1. 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.

  3. 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

    1. 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.

  4. 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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.