NULL en PL/SQL

El valor NULL en PL/SQL es algo delicado, sobre todo cuando queremos comparar variables que valen NULL.

  • El siguiente código mostrará por la salida estándar de texto DISTINTAS:
DECLARE
    var1 VARCHAR2(2) := NULL;
    var2 VARCHAR2(2) := NULL;
BEGIN
    IF var1 = var2 THEN
        dbms_output.put_line('IGUALES');
    ELSE
        dbms_output.put_line('DISTINTAS');
    END IF;
END;

  • Podemos poner otro ejemplo, usando otro operador de comparación. En el siguiente caso, lo que se mostrará será IGUALES:
DECLARE
    var1 VARCHAR2(2) := 'OK';
    var2 VARCHAR2(2) := NULL;
BEGIN
    IF var1 <> var2 THEN
        dbms_output.put_line('DISTINTAS');
    ELSE
        dbms_output.put_line('IGUALES');
    END IF;
END;

Existen muchos más ejemplos, pero con estos dos ya nos vamos dando cuenta de que algo no marcha. ¿Qué está pasando? EnPL/SQL, cualquier comparación que contenga al menos un valor NULL, devuelve false, por lo que nunca se cumplirá tal condición que se esté evaluando.

  • Cuando queremos comparar variables y protegernos de posible valores NULL, se suele usar la función NVL.
DECLARE
    var1 VARCHAR2(2) := 'OK';
    var2 VARCHAR2(2) := NULL;
BEGIN
    IF nvl(var1,'###') <> nvl(var2,'###') THEN
        dbms_output.put_line('DISTINTAS');
    ELSE
        dbms_output.put_line('IGUALES');
    END IF;
END;

Pero esto no es todo, hay que añadir algo más. En PL/SQL, asignar “cadena vacía” o NULL a una cadena es lo mismo. Esto no suele ocurrir en otros lenguajes de programación como Java, donde si hay diferencia.

  • El siguiente código, vuelve a mostrar DISTINTAS, por el mismo motivo explicado más arriba, ya que la condición evalúa NULL:
DECLARE
    var1 VARCHAR2(2) := '';
BEGIN
    IF var1 = '' THEN
        dbms_output.put_line('IGUALES');
    ELSE
        dbms_output.put_line('DISTINTAS');
    END IF;
END;
  • También es muy útil usar la sintaxis IS NULL o IS NOT NULL para trabajar con valores nulos.
DECLARE
    var1 VARCHAR2(2) := NULL;
    var2 VARCHAR2(2) := '';
    var3 VARCHAR2(2) := 'OK';
BEGIN
    IF var1 = var2 THEN
        dbms_output.put_line('Comparación errónea.');
    ELSIF var1 <> var2 THEN
        dbms_output.put_line('Comparación errónea.');
    ELSIF nvl(var1,'NULO') = var3 THEN
        dbms_output.put_line('IGUALES');
    ELSIF var1 IS NOT NULL AND var2 IS NOT NULL THEN
        dbms_output.put_line('FALSO');
    ELSE
        dbms_output.put_line('CUIDADO con los valores NULL, ' || var3 || '?');
    END IF;
END;
Anuncios
Esta entrada fue publicada en Uncategorized y etiquetada , , , , , , . Guarda el enlace permanente.

5 respuestas a NULL en PL/SQL

  1. Galo dijo:

    Muchas gracias, excelentes ejemplos, y una buena solución is null o is not null

    Le gusta a 1 persona

  2. Galo Galarza dijo:

    Muchas gracias, ejemplos hasta para que entienda un niño.

    Le gusta a 1 persona

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