martes, 18 de octubre de 2016

Función: Cual es Nulo?

Objetivos:
• Desarrollar una función que reciba X cantidad de parámetros y determine cual o cuales de ellos son nulos.
• Ver lo flexible que resulta PL/SQL.
____________________________________________________________________________________
Introducción.
Este requerimiento es básico en cualquier lenguaje de programación, de hecho suena bastante trivial, pero en realidad lo que queremos es plantear un escenario algo distinto al que a diario vemos. Comúnmente nos valemos de estructuras de control condicionales(CASE, IF ELSE) para así lograr este cometido, es por ello que les presento un enfoque algo distinto con cierto grado de eficiencia para llevar a cabo el fin.

Por supuesto, una vez determinemos cuales son nulos es inevitable usar las mencionadas estructuras de control para así ejecutar la acción deseada, pero esta tarea puede ser desarrollada en la aplicación final (Eje: Oracle Forms, JAVA) que hace uso de la función.
____________________________________________________________________________________
Bloque Anónimo con la Lógica de la Función.

SET SERVEROUTPUT ON
SET VERIFY OFF
DECLARE
    v_1 VARCHAR2(15);
v_2 VARCHAR2(15);
v_3 VARCHAR2(15);
--
CURSOR c_nulls
(
p_1 VARCHAR2,
p_2 VARCHAR2,
p_3 VARCHAR2
) IS
SELECT
 DECODE (p_1,NULL,0,1)+  --Si es nulo retorna 0 de lo contrario 1
  DECODE (p_2,NULL,0,2)+  --Si es nulo retorna 0 de lo contrario 2
  DECODE (p_3,NULL,0,4)  --Si es nulo retorna 0 de lo contrario 4
FROM dual;  --En si, este SELECT suma los valores antes generados.
--
v_resultado NUMBER(1);
BEGIN
DBMS_OUTPUT.PUT_LINE(REPLACE( --Uso el REPLACE para que no se muestren los espacios tabulares
                        '¿Cual o cuales son Nulos?
                        Ninguno: 7,
                        Solo el Primero: 6,
                        Solo el Segundo: 5,
                        Solo el Tercero: 3,
                        El Primero y el Segundo: 4,
                        El Primero y el Tercero: 2,
                        El Segundo y el Tercero: 1,
                        Todos son Nulos: 0'
                      ,'                        ',''));
--
v_1 := '&PARAM1';
v_2 := '&PARAM2';
v_3 := '&PARAM3';
--
OPEN c_nulls(v_1, v_2, v_3);
FETCH c_nulls INTO v_resultado;
CLOSE c_nulls;
--
DBMS_OUTPUT.PUT_LINE(CHR(10)||'Resultado: '||v_resultado);
END;
/*Primero que nada, creamos este bloque anónimo que tiene el mismo enfoque de la función a continuación. Notar como el bloque imprime en pantalla el criterio de evaluación sin la necesidad de usar estructuras se control condicionales.*/
---OUTPUT:
____________________________________________________________________________________
Función Cual_es_NULL.

CREATE OR REPLACE FUNCTION cual_es_null
(
p_1 VARCHAR2,
p_2 VARCHAR2,
p_3 VARCHAR2
) RETURN NUMBER IS
CURSOR c_nulls
(
cp_1 VARCHAR2,
cp_2 VARCHAR2,
cp_3 VARCHAR2
) IS
SELECT
 DECODE (cp_1,NULL,0,1)+
  DECODE (cp_2,NULL,0,2)+
  DECODE (cp_3,NULL,0,4)
FROM dual;
--
v_resultado NUMBER(1);
BEGIN
OPEN c_nulls(p_1, p_2, p_3);
FETCH c_nulls INTO v_resultado;
CLOSE c_nulls;
--
RETURN v_resultado;
END;
/
SHOW ERROR
/*He Aquí la Función. Para simplificar el código y facilitar el análisis decidimos hacerla que solo acepte 3 parámetros.*/
---
SELECT
        cual_es_null(NULL,'HOLA','K'),
        cual_es_null(8,NULL,'N*'),
        cual_es_null(NULL,NULL,NULL),
        cual_es_null(5,8,9),
        cual_es_null('HOLA',78,NULL)
FROM dual;
/*Probamos la función.*/
---OUTPUT: