Если на этапе заполнения базы данных разработчики не предусмотрели механизма предварительной проверки правильности 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)
Возможно кривость одной конкретной реализации валидатора не означает то, что проверка данных на корректность ввода и отсутствие механических ошибок-описок не нужна в принципе?