martes, 12 de mayo de 2009

Comparación de nulos en PL/SQL, función NVL

Cuando tenemos variables o parámetros que pueden valer nulo y los comparamos pueden producir resultados que no esperamos, por ejemplo:

declare
   v_variable1 varchar2(20):=null;
   v_variable2 varchar2(20):=null;
begin
   if v_variable1 = v_variable2 then
         --salida estandar de texto
         dbms.output.put_line('Bien');
   else 
         dbms.output.put_line('Mal');
   end if;
end;

ó tenemos

declare
   v_variable1 varchar2(20):=null;
   v_variable2 varchar2(20):='hola';
begin
   if v_variable1 <> v_variable2 then
         --salida estandar de texto
         dbms.output.put_line('Bien');
   else 
         dbms.output.put_line('Mal');
   end if;
end;

Fijaros que en segundo caso se ha cambiado el valor de la v_variable2 y el operador igual "=" por distinto "<>".
En ambos casos saldrá por la salida estándar el mensaje "Mal" esto es debido a que la comparación que contenga nulos siempre devuelve NULL y siempre se ejecutara la sentencia del "else".
Para arreglar esto podemos utilizar la función NVL, que teneis su sintaxis en la entrada de funciones integradas.

Para el ultimo caso:

declare
   v_variable1 varchar2(20):=null;
   v_variable2 varchar2(20):='hola';
begin
   if NVL(v_variable1,' ') <> NVL(v_variable2 then,' ')
         --salida estandar de texto
         dbms.output.put_line('Bien');
   else 
         dbms.output.put_line('Mal');
   end if;
end;

Ahora si que se ejecutara la sentencia del IF. El primer caso se soluciona de la misma forma.

No hay comentarios:

Publicar un comentario