Puedes hacer que te devuelva la letra correcta y compararla con la tuya (a) o devolver el fallo directamente (b):
(a)
CREATE OR REPLACE function letra_nif (p_nif in varchar2)
return varchar2 is
begin
if length(p_nif)>9 then return(null);
else
return(substr('TRWAGMYFPDXBNJZSQVHLCKET',(to_number(nif) -
((floor(to_number(nif) / 23)) * 23) + 1), 1));
end if;
exception
when others then return(null);
end;
(b) 0 = ok, 1= error
CREATE OR REPLACE function letra_nif (p_nif in varchar2, p_letra in varchar2)
return varchar2 is
v_letra_calculada varchar2(1);
begin
if length(p_nif)>9 then return('1');
else
v_letra_calculada :=substr('TRWAGMYFPDXBNJZSQVHLCKET',(to_number(nif) -
((floor(to_number(nif) / 23)) * 23) + 1), 1);
if v_letra_calculada <> p_letra then return('1');
else return ('0');
end if;
end if;
exception
when others then return(null);
end;