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 TipoClienteWHEN 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:
CASEWHEN 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 SaldoWHEN < 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_SEGMENTSORDER 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)
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_SEGMENTSORDER 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:
- Oracle Database 23c Free - Developer Edition.
- Instalando Oracle Database 23c (Free Developer Edition) en Oracle Cloud.
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