Created
October 11, 2011 13:01
-
-
Save Osukaru/1278016 to your computer and use it in GitHub Desktop.
Refactoring
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--Ahora: | |
CREATE OR REPLACE FUNCTION AEGPA_EP."EMAIL_VALIDO" (parametro IN OUT VARCHAR2) | |
RETURN BOOLEAN | |
IS | |
BEGIN | |
RETURN REGEXP_LIKE(parametro, '[a-zA-Z0-9._%-]+@[a-zA-Z0-9._%-]+\.[a-zA-Z]{2,4}'); | |
END email_valido; | |
/ | |
--Antes: | |
CREATE OR REPLACE FUNCTION AEGPA_PRODUCCION_DATOS."EMAIL_VALIDO" (parametro IN OUT VARCHAR2) | |
RETURN BOOLEAN | |
IS | |
correcto BOOLEAN := TRUE; | |
posicion_arroba NUMBER (2) := NULL; | |
-- el email se compone de parte1@parte2 | |
parte1 VARCHAR2 (32) := NULL; | |
tam_parte1 NUMBER (2) := NULL; | |
parte2 VARCHAR2 (63) := NULL; | |
tam_parte2 NUMBER (2) := NULL; | |
BEGIN | |
parametro := TRIM (UPPER (parametro)); | |
IF parametro IS NULL | |
THEN | |
correcto := FALSE; | |
-- Si el número de arrobas es distinto de 1 unidad | |
ELSIF LENGTH (parametro) - NVL (LENGTH(REPLACE (TRANSLATE (parametro, '@', ' '), ' ')), 0) <> 1 | |
THEN | |
correcto := FALSE; | |
-- n@d.e => 5 es el minimo de una direccion nombre arroba dominio punto extension | |
ELSIF LENGTH (parametro) < 5 | |
THEN | |
correcto := FALSE; | |
END IF; | |
IF correcto = TRUE | |
THEN | |
posicion_arroba := INSTR (parametro, '@'); | |
-- si no hay parte primera | |
IF NVL (LENGTH (SUBSTR (parametro, 1, posicion_arroba - 1)), 0) = 0 | |
THEN | |
correcto := FALSE; | |
-- Si no hay parte segunda | |
ELSIF NVL (LENGTH (SUBSTR (parametro, posicion_arroba + 1)), 0) = 0 | |
THEN | |
correcto := FALSE; | |
ELSE --Se supone que tenemos 2 partes | |
IF LENGTH (SUBSTR (parametro, 1, posicion_arroba - 1)) > 32 | |
THEN -- La máxima longitud de un nombre identificador son 32 caracteres | |
correcto := FALSE; | |
ELSE | |
parte1 := SUBSTR (parametro, 1, posicion_arroba - 1); | |
END IF; | |
IF correcto = TRUE | |
THEN | |
IF LENGTH (SUBSTR (parametro, posicion_arroba + 1)) > 63 | |
THEN -- La máxima longitud de un dominio son 63 caracteres | |
correcto := FALSE; | |
ELSE | |
parte2 := SUBSTR (parametro, posicion_arroba + 1); | |
END IF; | |
END IF; | |
END IF; | |
END IF; | |
-- Estudiamos que hay delante de la arroba | |
IF correcto = TRUE | |
THEN | |
tam_parte1 := LENGTH (parte1); | |
-- El primer caracter no puede ser ni un punto ni una arroba ni un subrayado bajo ni guion | |
IF NVL ( | |
LENGTH(TRIM(TRANSLATE (SUBSTR (parte1, 1, 1), | |
'.@_-0123456789', | |
' '))), | |
0 | |
) = 0 | |
THEN | |
correcto := FALSE; | |
-- Si hay un caracter que no sea ninguno de la lista que considero valido para nombre email | |
ELSIF NVL (LENGTH(REPLACE (TRANSLATE (parte1, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ._0123456789-', ' '), ' ')), 0) != 0 | |
THEN | |
correcto := FALSE; | |
-- El ultimo caracter no puede ser 1 | |
ELSIF NVL (LENGTH(TRIM(TRANSLATE (SUBSTR (parte1, LENGTH (parte1)), '.', ' '))), 0) = 0 | |
THEN | |
correcto := FALSE; | |
ELSE | |
-- no puede haber un dominio que tenga varios puntos consecutivos | |
tam_parte1 := tam_parte1 - 1; | |
FOR i IN 1 .. tam_parte1 | |
LOOP | |
IF SUBSTR (parte1, i, 1) = '.' | |
THEN | |
IF SUBSTR (parte1, i, 1) = SUBSTR (parte1, i + 1, 1) | |
THEN | |
correcto := FALSE; | |
EXIT; --romper el bucle | |
END IF; | |
END IF; | |
END LOOP; | |
END IF; | |
END IF; | |
--Estudiamos que se encuentra detrás de la arroba */ | |
IF correcto = TRUE | |
THEN | |
tam_parte2 := LENGTH (parte2); | |
-- Si el número de caracteres despues de la arroba es inferior a 3 entonces el dominio no es valido | |
IF tam_parte2 < 3 | |
THEN | |
correcto := FALSE; | |
-- Si el número de puntos detrás de la arroba es 0 entonces se le ha olvidado meter el punto del dominio | |
ELSIF tam_parte2 - NVL (LENGTH(REPLACE (TRANSLATE (parte2, '.', ' '), ' ')), 0) = 0 | |
THEN | |
correcto := FALSE; | |
-- El primer caracter no puede ser ni un punto ni guion ni numero | |
ELSIF NVL (LENGTH(TRIM(TRANSLATE (SUBSTR (parte2, 1, 1), '.@_-0123456789', ' '))), 0) = 0 | |
THEN | |
correcto := FALSE; | |
-- El ultimo caracter no puede ser ni 1 punto ni guion | |
ELSIF NVL (LENGTH(TRIM(TRANSLATE (SUBSTR (parte2, LENGTH (parte2)), '.-', ' '))), 0) = 0 | |
THEN | |
correcto := FALSE; | |
-- El siguiente caracter a la arroba no puede ser ni 1 punto ni guion | |
ELSIF NVL (LENGTH(TRIM (TRANSLATE (SUBSTR (parte2, 1, 1), '.-', ' '))), 0) = 0 | |
THEN | |
correcto := FALSE; | |
-- Si hay un caracter que no sea ninguno de la lista que considero valido para dominio, el guin subrayado está excluido | |
ELSIF NVL (LENGTH(REPLACE (TRANSLATE (parte2, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ.-0123456789', ' '), ' ')), 0) != 0 | |
THEN | |
correcto := FALSE; | |
ELSE | |
-- no puede haber un dominio que tenga varios puntos consecutivos o varios guiones seguidos | |
tam_parte2 := tam_parte2 - 1; | |
FOR i IN 1 .. tam_parte2 | |
LOOP | |
IF SUBSTR (parte2, i, 1) = '.' OR SUBSTR (parte2, i, 1) = '-' | |
THEN | |
IF SUBSTR (parte2, i, 1) = SUBSTR (parte2, i + 1, 1) | |
THEN | |
correcto := FALSE; | |
EXIT; --romper el bucle | |
END IF; | |
END IF; | |
END LOOP; | |
END IF; | |
END IF; | |
RETURN correcto; | |
END email_valido; | |
/ | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment