Если на этапе заполнения базы данных разработчики не предусмотрели механизма предварительной проверки правильности e-mail, то полезной будет следующая функция. Она возвращает 1, если адрес электронной почты корректен, и код ошибки в противном случае:

CREATE OR REPLACE FUNCTION EMAIL_CHECK (email varchar2)
--проверяет адрес эл. почты 1 - else - not ok
/********************************************/
--КОДЫ ОШИБОК
--0   Пустой email
--99  Нет символа @ или не заполнено имя пользователя или пароль
--100 Введённый email содержит пробелы в имени пользователя.
--101 Точка (.), в имени пользователя не может быть первым символом.
--102 Минус (-), в имени пользователя не может быть первым символом.
--103 Подчёркивание (_), в имени пользователя не может быть первым символом.
--104 Введённый email содержит недопустимые символы в имени пользователя
--105 Введённый email содержит пробелы в домене.
--106 Домен должен содержать хотя бы одну точку (.).
--107 Точка (.), в домене не может быть первым или последним символом.
--108 Введённый email содержит недопустимые символы в домене
--109 Введённый email содержит недопустимые символы в суффиксе домена (то, что написано после последней точки)
/********************************************/
RETURN INT
IS
 R INT:= 1;
 username VARCHAR(200);
 DOMAIN VARCHAR(200);
 msg VARCHAR(255);
 temp_str VARCHAR(200);
 len INT;
 
BEGIN
IF ltrim(rtrim(email)) IS NOT NULL THEN
 username:=LOWER(substr(email,1,instr(email,'@')-1));
 DOMAIN:=LOWER(substr(email,instr(email,'@')+1,LENGTH(email)-instr(email,'@')+1));
 
-- проверка @ и длины имени пользователя и домена
IF LENGTH(username)=0 OR LENGTH(DOMAIN)=0 THEN
    R := 99;
END IF;
 
-- проверка правильности имени пользователя
IF instr(username,' ')!=0 THEN
    R := 100;
END IF;
 
IF substr(username,1,1)='.' THEN
    R := 101;
END IF;
 
IF substr(username,1,1)='-' THEN
    R := 102;
END IF;
 
IF substr(username,1,1)='_' THEN
    R := 103;
END IF;
 
temp_str:=REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(username,'a',''),'b',''),'c',''),'d',''),'e',''),'f',''),'g',''),'h',''),'i',''),'j',''),'k',''),'l',''),'m',''),'n',''),'o',''),'p',''),'q',''),'r',''),'s',''),'t',''),'u',''),'v',''),'w',''),'x',''),'y',''),'z',''),'.',''),'_',''),'-',''),'0',''),'1',''),'2',''),'3',''),'4',''),'5',''),'6',''),'7',''),'8',''),'9','');
 
IF LENGTH(temp_str)<>0 THEN
    R := 104;
END IF;
 
 
-- проверка правильности домена
IF instr(DOMAIN,' ')!=0 THEN
    R := 105;
END IF;
 
IF instr(DOMAIN,'.')=0 THEN
    R := 106;
END IF;
 
IF substr(DOMAIN,1,1)='.' OR substr(DOMAIN,LENGTH(DOMAIN),1)='.' THEN
    R := 107;
END IF;
      temp_str:=REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(DOMAIN,'a',''),'b',''),'c',''),'d',''),'e',''),'f',''),'g',''),'h',''),'i',''),'j',''),'k',''),'l',''),'m',''),'n',''),'o',''),'p',''),'q',''),'r',''),'s',''),'t',''),'u',''),'v',''),'w',''),'x',''),'y',''),'z',''),'.',''),'-',''),'0',''),'1',''),'2',''),'3',''),'4',''),'5',''),'6',''),'7',''),'8',''),'9','');
 
IF LENGTH(temp_str)<>0 THEN
    R := 108;
END IF;
 
len:=LENGTH(DOMAIN);
while len>0 loop
   IF substr(DOMAIN,len,1)='.' THEN
     exit;
   END IF;
   len := len - 1;
END loop;
 
temp_str:=REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(substr(DOMAIN,len+1,LENGTH(DOMAIN)-len+1),'a',''),'b',''),'c',''),'d',''),'e',''),'f',''),'g',''),'h',''),'i',''),'j',''),'k',''),'l',''),'m',''),'n',''),'o',''),'p',''),'q',''),'r',''),'s',''),'t',''),'u',''),'v',''),'w',''),'x',''),'y',''),'z','');
 
IF LENGTH(temp_str)<>0 THEN
    R := 109;
END IF;
 
ELSE
  R := 0;
END IF;
  RETURN(R);
END;

Пример использования функции

SELECT
   EMAIL_CHECK('test@mail.ru')
FROM DUAL;

Источник: Реализация проверки правильности e-mail на SQL (Microsoft SQL Server)

Теги:
 

Комментировать