Saltar al contenido

Aprende Cómo Usar la Sentencia CASE en tus PL-SQL Packages en Oracle

PL-SQL Packages en OracleSi aprendes como se debe utilizar correctamente la sentencia CASE podrás tomar decisiones rápidamente dentro de tus PL-SQL Packages en Oracle.

La sentencia CASE, como su nombre lo indica, te permite evaluar casos o distintas condiciones realizando operaciones diferentes para cada uno de ellos en tus PL-SQL Packages en Oracle.

La sentencia CASE se puede usar de dos formas distintas en tus PL-SQL Packages en Oracle, la primera te permite evaluar la igualdad de una variable y la segunda te permite evaluar condiciones de cualquier tipo.

Revisemos como es la sintaxis de la sentencia CASE en tus PL-SQL Packages en Oracle:

CASE [valor_a_comparar]

WHEN [valor1 | condicion1] THEN {sentencias;}

WHEN [valor2 | condicion2] THEN {sentencias;}

:

ELSE {sentencias};

END CASE;

Donde:

CASE= Permite declarar una sentencia CASE en tus PL-SQL Packages en Oracle.

Valor_a_comparar= Corresponde al valor de una variable o campo que se quiere evaluar.

WHEN= Permite definir los distintos valores o condiciones que serán evaluados dentro del CASE.

Valor= Corresponde al valor con el cual será comparado el valor_a_comparar dentro del WHEN.

Condicion= Permite definir una condición para que sea evaluada por en WHEN.

THEN= Permite terminar la definición de valores o condiciones dentro del WHEN.

Sentencias= Corresponde a las sentencias que se ejecutarán si la condición definida en el WHEN es verdadera.

ELSE= Permite definir un caso contrario cuando no se cumple ninguna de las condiciones definidas en el WHEN.

END CASE= Permite cerrar la declaración de la sentencia CASE en tus PL-SQL Packages en Oracle.

TÚ REPORTE: “Cómo Construir un SELECT Eficiente en ORACLE en Solo 7 Pasos”

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

Veamos ahora un ejemplo para que entiendas mejor como se debe utilizar la sentencia CASE en tus PL-SQL Packages en Oracle.

Ejemplo #1: Supone que debes evaluar la edad de un empleado, veamos como se hace:

/* PL-SQL Packages en Oracle */

CASE lin_edad

When 25 Then lin_porcentaje:= 10;

When 30 Then lin_porcentaje:= 15;

When 35 Then lin_porcentaje:= 17;

Else lin_porcentaje:= 5;

END CASE;

En este ejemplo se esta evaluando el valor de la variable lin_edad en tus PL-SQL Packages en Oracle usando la primera forma del CASE y se asigna un distinto porcentaje dependiendo de la edad del empleado. Esta primera forma es muy util cuando necesitas evaluar igualdades de datos.

Ejemplo #2: Veamos ahora el mismo ejemplo anterior pero aplicando la segunda forma del CASE, revisemos como se hace:

/* PL-SQL Packages en Oracle */

CASE

When lin_edad <= 25 Then lin_porcentaje:= 10;

When lin_edad >= 30 Then lin_porcentaje:= 15;

When lin_edad >= 35 and lin_edad <= 40 Then lin_porcentaje:= 17;

Else lin_porcentaje:= 5;

END CASE;

En este ejemplo se pueden aplicar mas condiciones dentro de la cláusula WHEN, esta segunda forma del CASE es mas flexible que la primera en tus PL-SQL Packages en Oracle.

Te propongo que pruebes de inmediato estos ejemplos en tu Base de Datos con tus propias tablas,  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 Packages en Oracle y/o dime cuál es tu principal frustración a la hora de trabajar con PL-SQL Packages en Oracle. Estaré muy atento respondiendo tus preguntas y/o comentarios, gracias.

Saludos

Roberto Vicencio – Para Tu Éxito con Oracle.

Director del Curso “Domina Tus Packages En Oracle

37 comentarios en «Aprende Cómo Usar la Sentencia CASE en tus PL-SQL Packages en Oracle»

    1. Hola Lourdes, gracias por comunicarte y por tu comentario, por supuesto que puedes usar todas esas instrucciones en un case colocandolas despues del then, gracias.

      PD: Ya obtuviste mi Libro-Reporte gratuito sobre “Como Construir un SELECT Eficiente en Oracle en Solo 7 Pasos”, si aún no lo tienes puedes obtenerlo gratis desde aquí:
      https://dominatuspackagesen0racle.com/

      Saludos
      Roberto Vicencio – Para Tu Éxito con Oracle.

  1. A ver si entendí: en el segundo ejemplo solo se va por el else para menores de 24; y para mayores de 30(tengan 35..40, o más) siempre el porcentaje será 15, es decir, nunca entra por la cláusula antes del else…..

    1. Hola Rafael, gracias por comunicarte y por tu comentario, déjame mostrarte como funciona el segundo ejemplo, todos los menores o iguales a 25 años (incluido los de 24 años) tendrán un porcentaje de 10, de 26 a 29 años se irán por el else con un porcentaje de 5, los mayores o iguales de 30 años (como bien lo viste tu) siempre tendrán un porcentaje de 15, por lo tanto tal como lo indicas la condición del tercer when nunca será verdadera, lo importante de este ejemplo es que veas como usar el Case y las condiciones que se pueden aplicar, gracias.

      PD: Ya obtuviste mi reporte gratuito sobre ‘Como Construir un SELECT Eficiente en Oracle en Solo 7 Pasos’, si aún no lo tienes puedes obtenerlo haciendo clic aquí:
      https://dominatuspackagesen0racle.com/

      Saludos
      Roberto Vicencio – Para Tu Éxito con Oracle.

  2. hola gracias por dedicar el tiempo para un lenguaje que es de gran utilidad, tengo una duda con respecto a los commit y rollback en Oracle, mi duda es que en un sistema visual Basic 6.0 con interacción de una componente llama a un package Oracle con un procedimiento de nombre numero1, luego de terminar con este procedimiento invoca a otro procedimiento de nombre numero2 esto en la misma interacción y como final ejecutar un procedimiento numero3 que solo se encargue de hacer commit o rollback de los procedimientos de antes, esto es posible, de ante mano muchas gracias.

    1. Hola Nelson, gracias por comunicarte y por tu comentario, no conozco mucho como trabaja VB en el sentido de instancias con la base de datos, porque si los procesos que quieres ejecutar se procesan en una misma instancia no habria problema con lo que quieres hacer, pero si se ejecutan en instancias diferentes no te va a funcionar ya que los datos que quieres grabar se perderían en las otras instancias, lo que yo recomiendo es hacer todo en un solo procedimiento, pero si no te sirve lo mejor es hacer una prueba para salir de dudas haciendo un insert en el proceso numero1, un update en el proceso numero2 y un commit en el proceso numero3, asi podrás despejar las dudas, gracias.

      Saludos
      Roberto Vicencio – Para Tu Éxito con Oracle.
      https://dominatuspackagesen0racle.com/

  3. Muchas gracias por la respuesta, pero estoy obligado a hacer 3 procedimientos ya que visual Basic no soporta enviar como arrays la carga de datos del procedimiento numero2, entonces visual invocara varias veces el procedimiento 2 en un ciclo, gracias.

  4. muy buena la explicación, te puedo hacer una consulta.
    si yo pongo varios case en mi query la performance no va variar a nivel de procesamiento?
    ejm.
    select campo1,
    case campo2
    when 1 then ‘bueno’
    when 2 then ‘malo’
    end case,
    case campo3
    when 1 then ‘padre’
    when 2 then ‘madre’
    when 3 then ‘abuelo’
    end case,
    campo4
    from tabla1

  5. Que tal mira soy nuevo en esto y practicamente he aprendido de manera autodidacta y apoyandome en algunos compañeros de la oficina.
    y tengo un pequeño problema en la BD que administro.
    tengo una tabla que se llama USUARIOS,y a estos usuarios se les asigno un número para identificar quien esta cargando registros, mi problema es que tengo usuarios con un número diferente que cargan información a la base de datos que no se reflejan en la información del número de usuario correcto, es decir por ejemplo el usuario número 17 pertenece a un estado en especial de la republica y si el carga algun registro se ve reflejado en su entidad número 17, pero existen otros tres usuarios por ejemplo. 21,22,23 que pertenecen al mismo estado pero si estos cargan información no se ve reflejada en el usuario 17 que es el principal, esta información que estos usurios cargan por logica se ve reflejada 21,22 y 23.
    mi pregunta es, como puedo hacer para que la suma de estos registros se vea reflejada en el usuario principal que es el número 17.
    Espero me puedas orientar.

    1. Hola ERV, gracias por comunicarte y por tu comentario, si entiendo bien el problema creo que la solución ya la tienes pero no la has visto, si todos los usuarios pertenecen a un mismo estado debes agrupar la información por estado y no por usuario, luego tienes que asociar esa suma de registros a tu usuario principal que ya lo tienes identificado, no se como es el modelo de datos pero me imagino que es algo como esto:

      — aquí obtienes los registros por estado
      select estado, count(1)
      from tabla_registros
      group by estado;

      — aquí obtienes los usuarios principales por estado
      select estado, usuario
      from tabla_usuarios
      where principal = 1;

      Saludos
      Roberto Vicencio – Para Tu Éxito con Oracle.
      https://dominatuspackagesen0racle.com/

  6. Tienes algún correo o medio de contacto para solicitar tu ayuda acerca de como aplicar una sentencia “Case”, es un caso particular, me piden hacer un reporte donde muestre un conteo de contrataciones mensual desglosado por años 2013 y 2014, la tabla se llama SIAP.EMPLEADO y el campo donde se muestra la fecha de contratación se llama FCH_INICIO_COMP.

    Me podrías ayudar?, mil gracias.

    1. Hola Luis, gracias por comunicarte, según lo que entiendo debes mostrar en el reporte la cantidad de contratos realizados por mes en los dos últimos años, bueno para lograr esto creo que no necesitas usar el Case solo debes hacer un grupo de datos como lo siguiente:

      select to_char(FCH_INICIO_COMP,’mm-yyyy’) mes_anho, count(1) cant_contratos
      from SIAP.EMPLEADO
      where FCH_INICIO_COMP >= ‘01012013’
      group by to_char(FCH_INICIO_COMP,’mm-yyyy’);

      PD: Ya obtuviste mi libro-reporte “Cómo Construir un SELECT Eficiente en Oracle en Solo 7 Pasos”, si aún no lo tienes puedes obtenerlo desde este enlace:
      https://dominatuspackagesen0racle.com/

      Saludos
      Roberto Vicencio – Para Tu Éxito con Oracle.
      Contactarme a info@dominatuspackagesen0racle.com

  7. Hola Roberto muy buen día, la cuestión aquí es que tenemos que contabilizar los usuarios que están activos desde el 2013 a la fecha desglosado por mes y tipo de contratación, los campos y tabla son:

    Tabla: empleado
    Campo :n_empleado

    Estaba pensando en un Case pero no se como armarlo para que me traiga el reporte desglosado en columnas por mes.

    (Con esto extraigo selecciono al personal que esta activo):
    substr(d_empleado,1,1)=’A’

    Mis condiciones para tomar en cuenta año, tipo de plaza y tipo de contratación, (Aquí no tengo problema):
    WHERE FCH_PAGO BETWEEN ’01/01/2013′ AND ’31/12/2013′
    AND D_TPO_PLAZA IN (‘S’)
    AND D_TPO_PLAZA_MAESTRO IN (‘E’)

    Como ves, me puedes ayudar por favor???, mil gracias.

    Saludos cordiales.

    1. Hola Igasca1, gracias por comunicarte, para hacer eso existen varias alternativas como por ejemplo usar una estructura, pero aquí te muestro una forma de hacerlo en la misma query, como te dije antes tienes que hacer un grupo de datos y en vez de usar un Case usa la función Decode:

      select
      to_char(FCH_PAGO,’yyyy’) anho,
      sum(decode(to_char(FCH_PAGO,’mm’),’01’,count(1),0)) enero,
      sum(decode(to_char(FCH_PAGO,’mm’),’02’,count(1),0)) febrero,
      sum(decode(to_char(FCH_PAGO,’mm’),’03’,count(1),0)) marzo,
      sum(decode(to_char(FCH_PAGO,’mm’),’04’,count(1),0)) abril
      WHERE FCH_PAGO BETWEEN ’01/01/2013′ AND ’31/12/2013′
      AND D_TPO_PLAZA IN (‘S’)
      AND D_TPO_PLAZA_MAESTRO IN (‘E’)
      and substr(d_empleado,1,1)=’A’
      group by
      to_char(FCH_PAGO,’yyyy’),
      to_char(FCH_PAGO,’mm’);

      PD: Si te han gustado los artículos recomienda este enlace https://dominatuspackagesen0racle.com/ a tus amigos o personas que también les pueda interesar esta información, gracias.

      Saludos
      Roberto Vicencio – Para Tu Éxito con Oracle.

    1. Hola Carlos, gracias por comunicarte y por tu comentario, hasta ahora tengo entendido que Form y Report son productos que siguen vigentes y no han sido sustituidos, su ultima versión fue lanzada este año 2014: Oracle Forms and Reports 11gR2 (11.1.2.2.0).

      PD: Si te han gustado los artículos recomienda este enlace https://dominatuspackagesen0racle.com/ a tus amigos o personas que también les pueda interesar esta información.

      Saludos
      Roberto Vicencio – Para Tu Éxito con Oracle.

  8. Hola, tengo una duda, estoy haciendo una transformacion de unos querys de access a oracle. El caso es que quiero poner esta instruccion de access en un case when de oracle, pero no entiendo muy bien la logica de como acomodarlo, me podrian ayudar? la instruccion de access es la siguiente:

    IIf([DES_CG]=”CICLICA”,IIf([DEE]=-7777,IIf([CVE_DEST]=”” Or [CVE_DEST] Is Null,”P”,”D”),IIf([REGION]=”METROPOLITANA”,IIf([DEE]<34,"EP","FP"),IIf([DEE]<34,"EP","FP"))),IIf([DEE]=-7777,IIf([CVE_DEST]="" Or [CVE_DEST] Is Null,"P","D"),IIf([Servicio]="PREMIUM",IIf([REGION]="METROPOLITANA",IIf([DEE]<9,"EP","FP"),IIf([DEE]<12,"EP","FP")),IIf([REGION]="METROPOLITANA",IIf([DEE]<14,"EP","FP"),IIf([DEE]<19,"EP","FP"))))) AS TAB,

    de antemano muchas gracias

    1. Que tal Magali, para hacer esta conversión primero debes ordenar el if para que te quede claro lo que hace y luego debes ir haciendo case when anidados, algo como lo siguiente:

      — Ordenar el if original —
      IIf([DES_CG]=”CICLICA”,
      IIf([DEE]=-7777,
      IIf([CVE_DEST]=”” Or [CVE_DEST] Is Null,
      ”P”,”D”),
      IIf([REGION]=”METROPOLITANA”,
      IIf([DEE]<34,"EP","FP"),
      IIf([DEE]<34,"EP","FP")
      )
      ),
      IIf([DEE]=-7777,
      IIf([CVE_DEST]="" Or [CVE_DEST] Is Null,
      "P","D"),
      IIf([Servicio]="PREMIUM",
      IIf([REGION]="METROPOLITANA",
      IIf([DEE]<9,"EP","FP"),
      IIf([DEE]<12,"EP","FP")
      ),
      IIf([REGION]="METROPOLITANA",
      IIf([DEE]<14,"EP","FP"),
      IIf([DEE]<19,"EP","FP")
      )
      )
      )
      )

      -- crear el case según el if de arriba --
      case
      when DES_CG=”CICLICA” then
      case
      when DEE =-7777 then
      case
      when CVE_DEST=”” Or CVE_DEST Is Null then
      ”P”
      else
      ”D”
      end case

      Saludos
      Roberto Vicencio - Para Tu Éxito con Oracle.

  9. buenas tengo una pregunta el case funciona fuera de un select me explico yo quiero asignar a un record un valor si en un procedimiento el parametro me llega ‘0’ y si llega cualquier otro entonces asigno el parametro que me llega, no se si me explique bien pero ese es mi problema. es para evitarme el manejo de los null que hago esto

    1. Hola Roger, gracias por comunicarte, claro que se puede usar el case fuera de un select ya que es muy flexible al contrario de un if.

      PD: Ya pudiste ver mi libro-reporte sobre ‘Cómo Construir un SELECT Eficiente en ORACLE en Solo 7 Pasos’, si aún no lo tienes en tus manos puedes obtenerlo desde aquí: https://dominatuspackagesen0racle.com/

      Saludos
      Roberto Vicencio – Para Tu Éxito con Oracle.

    1. Hola Luis, gracias por comunicarte, claro que se puede usar dentro de un case, pero ese case debe estar inserto en una instrucción SQL (select, insert, update, delete), de lo contrario no funcionara.

      PD: Si te ha gustado lo que has visto del blog te invito a compartir el enlace https://dominatuspackagesen0racle.com/ con tus amigos o personas que también les pueda interesar este contenido, gracias.

      Saludos
      Roberto Vicencio – Para Tu Éxito con Oracle.

  10. Hola
    Entiendo el uso de Case, mi pregunta es si puedo darle nombre a la columna que me va a devolver cualquier de los resultados del Case?

    Digamos

    Case
    When Ctl.Uom_Code ‘UNI’ Then
    (Ctl.Quantity_Invoiced/(select conversion_rate from mtl_uom_conversions muc where muc.inventory_item_id = Ctl.Inventory_Item_Id And uom_code = ‘UNI’))
    When Ctl.Uom_Code = ‘UNI’ Then
    Ctl.Quantity_Invoiced
    End Nombre_Columna

    Gracias y saludos,

    1. Hola Arturo, gracias por comunicarte, estas en lo correcto de esa forma puedes darle un nombre a la columna que traerá el resultado del case dentro de un select, gracias.

      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 desde aquí https://dominatuspackagesen0racle.com/

      Saludos
      Roberto Vicencio – Para Tu Éxito con Oracle

  11. Hola, Espero me ayuden tengo esta funcion:

    create or replace function
    calculoTrimestre (Pfecha Date)
    Return number IS VAR NUMBER;
    Begin
    select case
    when substr(Pfecha,4,2)<4
    then 'trimestre_1'
    when substr(Pfecha,4,2)
    between 4 and 6
    then 'trimestre_2'
    when substr(Pfecha,4,2)
    between 7 and 9
    then 'trimestre_3'
    when substr(Pfecha,4,2)
    between 10 and 12
    then 'trimestre_4'
    end
    into var
    from dual;
    RETURN VAR ;
    END;
    /

    Entra sin errores a SQLplus, y tengo esta vista:

    create view Tiempo_trimestre as
    (select calculoTrimestre (Fec_Alta) trimestre from cuentas);

    pero a la hora de hacer la consulta, no se como o la estoy haciendo mal, espero me puedan ayudar.
    la consulta la hago asi:

    select * from tiempo_trimestre;

    todo se jala de una BD donde tengo 500 registros, tengo una funcion y vista para hacer lo mismo pero de forma anual, y lo hace bien pero con esta que es trimestral no puedo.

    De ante mano gracias.

    1. Hola Luis, gracias por comunicarte, a simple vista creo que el problema lo tienes en la fecha que manejas, estas declarando un parámetro de tipo fecha ‘Pfecha Date’, pero dentro del select estas manejando esa fecha como un texto ‘substr(Pfecha,4,2)’, si la vas a manejar como texto primero debes transformarla con la función to_char, gracias.

      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 desde aquí https://dominatuspackagesen0racle.com/

      Saludos
      Roberto Vicencio – Para Tu Éxito con Oracle

  12. Buenas tardes,
    necesito hacer una consulta a una base de datos el resultado que estoy buscando es que me muestre en una columna especifica los siguientes caracteres de 0 a 9 contenga esto ;,¦\.\-]+$ quedo atento a su ayuda

    1. Hola Jhon, gracias por comunicarte, no esta muy claro lo que necesitas hacer, envíame un ejemplo de como deben quedar las columnas, gracias.

      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.

  13. Buenas tardes
    El problema que quiero solucionar es este

    select /*+PARALLEL(A,6)*/
    * from DROUASDJHH.CALL;_TICKETS._BILLING partition A
    WHERE not ( REGEXP_LIKE(MOVIMIENTO_CUENTAS,
    ‘(^[0-9;,¦\.\-]+$)’)) estos son los caracters que debo encontrar en la consulta y la verdad no he podido
    muchas gracias por la ayuda.

    1. Hola Jhon, gracias por comunicarte, lo que te aconsejo en estos casos es que pruebes de forma separada las expresiones regulares que estas usando, es decir, prueba primero ‘^[0-9]’ si funciona agrega otro caracter ‘^[0-9;]’ y luego otro y así sucesivamente hasta que encuentres la formula correcta.

      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.

  14. hola buenas tardes.
    mi consulta es la siguiente, quiero hacer un procedimiento almacenado en donde hay uan tabla que tiene el siguiente campo llamado STATUS las cuales se insertan id en 2,4 y 12, el procedimiento seria que cada ves que en la tabla halla mas de 10 registro en estado 12,4 o 2 me muestre mensaje indicadon que hay x candida de registros.

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.