martes, 2 de mayo de 2023

Oracle 23c - Mejoras a Sentencias y Expresiones CASE en PL/SQL


Oracle Database 23c introduce algunas mejoras a las sentencias y expresiones CASE que las hacen más fáciles de usar en PL/SQL


CASE con Comparaciones Adicionales a Igualdad (Sentencia y Expresión)

Hasta la versión 23c, tanto las sentencias como expresiones CASE permitían solo comparaciones por igualdad cuando se usaba en su forma simple, si se deseaba comparar de otra forma debía usarse en su forma "de búsqueda" como mostramos a continuación:

Ejemplo de Forma Simple (sólo Igualdad)

Cuando necesitamos usar solo igualdades, podemos usar la forma simple:

CASE TipoCliente
    WHEN 1 THEN 'Mayorista'
    WHEN 2 THEN 'Minorista'
    WHEN 3 THEN 'No Clasificado'
END CASE


Ejemplo de Forma de Búsqueda

Pero si necesitamos buscar valores no sólo por igualdad entonces tenemos que usar la forma de búsqueda, de la siguiente manera:

CASE
    WHEN Saldo < 100000 THEN 'Deudor - Crítico'
    WHEN Saldo < 0 THEN 'Deudor - Normal'
    WHEN Saldo = 0 THEN 'Neutro'
    WHEN Saldo > 0 THEN 'Acreedor'
END CASE

La diferencia es que en cada cláusula WHEN debemos escribir una operación de comparación que devuelva un valor verdadero o falso, teniendo que repetir en este caso el nombre de la columna que deseamos comparar.


Case de Forma Simple en Oracle 23c

Ahora es posible usar una sentencia CASE de forma más simple, especificando la columna o expresión a utilizar para comparar una sola vez, y aclarando en cada cláusula WHEN la operación de comparación (mayor, menor, distinto, etc) que se desea realizar, en caso que no sea de tipo igualdad:

CASE Saldo
    WHEN < 100000 THEN 'Deudor - Crítico'
    WHEN < 0 THEN 'Deudor - Normal'
    WHEN 0 THEN 'Neutro'
    WHEN > 0 THEN 'Acreedor'
END CASE

A continuación vemos un ejemplo muy simple de su uso como expresión (esta mejora también aplica a CASE como sentencia, no sólo como expresión):

DECLARE vTipo VARCHAR2(20); BEGIN FOR cSegmentos IN (SELECT SEGMENT_NAME, BLOCKS FROM USER_SEGMENTS
                       ORDER BY SEGMENT_NAME FETCH FIRST 10 ROWS ONLY) LOOP vTipo := CASE cSegmentos.BLOCKS WHEN > 1000 THEN 'Gigante' WHEN > 100 THEN 'Grande' WHEN > 0 THEN 'Normal' WHEN 0 THEN 'Vacío' END; DBMS_OUTPUT.PUT_LINE (cSegmentos.SEGMENT_NAME || ' es ' || vTipo); END LOOP; END; /

Lo cual devuelve lo siguiente:


CASE con Múltiples Comparaciones (Sentencia y Expresión)

Adicionalmente, cuando existe más de una condición que debe devolver el mismo valor, podemos usar todas ellas en la misma sección de la cláusula WHEN en vez de tener que especificar una cláusula por cada condición, usando si deseamos la opción de comparación por cualquier tipo de operación.

A continuación, vemos un ejemplo pero usando una sentencia CASE en vez de una expresión (le mejora es válida para ambas)  y usando también la opción de comparación no sólo por igualdad sino también por rangos:

DECLARE vTipo VARCHAR2(20); BEGIN FOR cSegmentos IN (SELECT SEGMENT_NAME, BLOCKS FROM USER_SEGMENTS
                       ORDER BY SEGMENT_NAME FETCH FIRST 10 ROWS ONLY) LOOP CASE cSegmentos.BLOCKS     WHEN > 1000 THEN vTipo := 'Gigante';
WHEN > 100 THEN vTipo := 'Grande';
WHEN 8, 16, 32, 64 THEN vTipo := 'Normal';
WHEN 0 THEN vTipo := 'Vacío';
END CASE; DBMS_OUTPUT.PUT_LINE (cSegmentos.SEGMENT_NAME || ' es ' || vTipo); END LOOP; END;
/


Conclusión

Estas mejoras a la sentencia y expresión CASE simplifican la escritura de código PL/SQL permitiendo escribir estas acciones en forma más concisa y clara.


Si desean conocer más sobre Oracle 23c, es recomendable que vean estos artículos en este blog como punto de partida:

Adicionalmente, pueden consultar todos los artículos relacionados a Oracle Database 23c agrupados en en el tag Database 23c.


No hay comentarios.:

Publicar un comentario