Aprenda a usar la Función DECODE en los Packages en Oracle

Saber dónde y cómo usar la función DECODE  de Oracle te permitirá solucionar muchos problemas que se presenten al momento de construir los Procedures en Oracle y Function en Oracle, especialmente cuando estas desarrollando Cursores, Select, Update, etc.

La función DECODE  es una de las muchas funciones que trae Oracle que te facilitan el desarrollo de procesos, en español significa decodificar, por lo tanto, la función te permite decodificar un valor para que devuelva o retorne otro valor, es decir, es como usar la cláusula IF donde se puede preguntar si un dato es igual a algo y realizar una acción.

Al principio cuesta un poco aprender a usar la función DECODE  ya que tiene una sintaxis muy particular, personalmente me costó un poco acostumbrarme a usarla, pero una vez que entiendes como funciona solo la ocupas y su sintaxis se hace natural para ti. Para entender mejor como se ocupa esta función revisemos algunos ejemplos:

Ejemplo #1: Supongamos que en nuestra tabla T_Empleados tenemos el campo Estado_Civil que puede contener los valores 1, 2, 3 y 4, donde 1 es Soltero, 2 es Casado, 3 es Separado y 4 es Viudo. Se requiere que cuando se consulten los empleados de un departamento se muestre el nombre del Estado Civil, veamos cómo se hace.

/* Packages en Oracle */

Select Emp.Rut, Emp.Nombre, Emp.Direccion, Decode (Emp.Estado_Civil, 1, ’Soltero’, 2, ’Casado’, 3, ’Separado’, 4, ’Viudo’, ’No definido’) Nombre_Estado_Civil From T_Empleados Emp Where Emp.Id_Departamento = p_Id_Departamento;

En este ejemplo usamos la función Decode para decodificar el campo Estado_Civil de la tabla T_Empleados y obtener el nombre del estado civil, si se fijan el primer parámetro del Decode es el valor del campo a decodificar, en este caso Emp.Estado_Civil, el segundo parámetro es 1, el tercero tiene la palabra ‘Soltero’ y así sucesivamente, donde el Decode pregunta si el valor del campo Emp.Estado_Civil es 1 entonces devuelve el valor ‘Soltero, si el valor es 2 entonces retorna ‘Casado’’ y así lo repite con todos, si viene un valor que no lo encuentre el Decode retorna ‘No Definido’.

TÚ REPORTE: “Cómo Construir un SELECT Eficiente en ORACLE en Solo 7 Pasos”  ¡ Haz Click Aquí y Descárgalo GRATIS Ahora !

Ejemplo #2: Ahora supongamos que debemos hacer una consulta a la tabla T_Empleados de todos los empleados de un departamento pero que sean de un estado civil particular, al proceso se pasa el nombre del estado civil como parámetro.

/* Procedures en Oracle */

Select Emp.Rut, Emp.Nombre, Emp.Direccion, Decode (Emp.Estado_Civil, 1, ’Soltero’, 2, ’Casado’, 3, ’Separado’, 4, ’Viudo’, ’No definido’) Nombre_Estado_Civil From T_Empleados Emp Where Emp.Id_Departamento = p_Id_Departamento And Emp.Estado_Civil = Decode ( p_Nom_Estado_Civil,  ’Soltero’, 1,  ’Casado’, 2, ’Separado’, 3, ’Viudo’, 4);

En este ejemplo mantenemos el Decode en la columna Nombre_Estado_Civil del Select, pero además se agregó en la cláusula Where un Decode para buscar un estado civil particular, si el parámetro p_Nom_Estado_Civil es ‘Soltero’ se devuelve 1, si es ‘Casado’ se devuelve 2 y así lo repite con los demás datos.

No dudes en dejarme tu pregunta o comentario sobre este artículo, yo estaré muy atento para resolver todas las dudas que tengas al respecto. Puedes contarme además que tema te interesa saber sobre Packages en Oracle o cuál es tu principal frustración a la hora de construir Procedures en Oracle y/o Function en Oracle, gracias.

Saludos

Roberto Vicencio – Escritor del Reporte:

Cómo Construir un SELECT Eficiente en ORACLE en 7 Pasos

Esta entrada fue publicada en Function en Oracle, Packages en Oracle, Procedures en Oracle y etiquetada , , , , , . Guarda el enlace permanente.

4 respuestas a Aprenda a usar la Función DECODE en los Packages en Oracle

  1. lom dijo:

    Select first_name||’ ‘||last_name,decode(salary,(salary<8000),'Ingreso bajo',
    (salary=11000),’ingreso alto’,’no registrado’)
    from employees

    quiero hacer esto pero me dice que me falta el parentesis derecho.

    • Hola Lom, gracias por comunicarte, una debilidad del decode es que solo puedes preguntar por igualdades o desigualdades, pero no puedes preguntar por menor que “”. La forma de solucionarlo es usar un case de la forma siguiente:

      Select first_name||’ ‘||last_name, case when salary<8000 then 'Ingreso bajo' when salary=11000 then ’ingreso alto’ else 'no registrado’ end tipo_ingreso
      from employees

      Espero te sirva esto.

      Saludos
      Roberto Vicencio.

  2. vanee dijo:

    hola q tal… bueno mi problema es el siguiente: tengo dos tablas una de empleados y y otra de vehiculos, la relacion es de un empleado esta designado a uno o varios vehiculos debo sacar un reporte de uno y a tambien de todos los empleado q tengan vehiculos:
    las tablas son:
    empleado vehiculo
    cod_empleado id_interno
    nombre marca
    apellidos modelo
    cod_empleado
    mi consulta es
    SELECT*
    FROM empleado em INNER JOIN id_interno id
    on em.cod_empleado = id.cod_empleado
    WHERE em.cod_empleado= : codigo

    la busqueda para hacer el reporte debe ser al introducir el cod del empleado, use el parametro “codigo” y si introdusco el codigo me sale del empleado especifico el problema es que no se como generar para que me devuelva toda la lista general de todos los empleados
    espero puedas ayudarme …..porfavor

    • Hola Vanee, gracias por comunicarte, para traer toda la lista de empleados debes hacer la misma query pero quitando el where de la siguiente manera:

      SELECT *
      FROM empleado em INNER JOIN id_interno id
      on em.cod_empleado = id.cod_empleado;

      PD: Si te ha gustado el blog te invito a compartir el enlace http://dominatuspackagesenoracle.com/blog/ con tus amigos o personas que también les pueda interesar este contenido, gracias.

      Saludos
      Roberto Vicencio – Para Tu Éxito con Oracle.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s