Skip to content

Instantly share code, notes, and snippets.

@Osukaru
Created October 11, 2011 13:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Osukaru/1278016 to your computer and use it in GitHub Desktop.
Save Osukaru/1278016 to your computer and use it in GitHub Desktop.
Refactoring
--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