2009-04-24 1 views
3

Был бы признателен за некоторые советы по следующему: возможно ли проверять поля электронной почты и почтового индекса через какое-либо ограничение проверки в sql в oracle? или такого рода вещи, как я подозреваю, pl/sql с регулярными выражениями?проверка на полях электронной почты/почтового индекса в sql/oracle

Благодаря

ответ

1

Если вы беспокоитесь только с США, есть несколько источников почтовых индексов, которые вы можете получить в формате плоских файлов и импорте в таблицу, а затем применить ограничение внешнего ключа в вашем адреса этой таблицы.

Адреса электронной почты могут быть сопоставлены с регулярным выражением (требуется 10 г или более) для проверки формата, но проверка того, являются ли они фактическими адресами, является гораздо более сложной задачей.

+0

спасибо, вот полезно - я просто наткнулся на некоторую информацию оракула, который связывает с вашим 10г или высший рег-контроль проверки - http://www.oracle.com/technology/oramag/webcolumns/2003/techarticles/rischert_regexp_pt2.html – 2009-04-24 20:26:03

+0

@oej ссылка выше была удалена –

7

Вот регулярное выражение синтаксиса для адреса электронной почты, в том числе котировки

'[a-zA-Z0-9._%-][email protected][a-zA-Z0-9._%-]+\.[a-zA-Z]{2,4}' 

Таким образом, вы можете использовать REGEXP_LIKE() в, где положение или REGEXP_SUBSTR(), чтобы проверить, содержит ли поле действительный адрес электронной почты. Вот пример: вы увидите, что regexp_substr() возвращает NULL на адрес, отсутствующий .domain, что не позволяет проверить подстроку. Оттуда вы можете построить проверочное ограничение вокруг него, или применять его, используя триггер (гадость) и т.д.

SQL> desc email 
Name          Null? Type 
----------------------------------------- -------- ---------------------------- 
EMAIL_ID           NUMBER 
EMAIL_ADDRESS          VARCHAR2(128) 


SQL> select * from email; 

    EMAIL_ID EMAIL_ADDRESS 
---------- ---------------------------------------- 
     1 [email protected] 
     2 [email protected] 
     3 [email protected] 
     4 [email protected]_domaindotorg 


SQL> @qry2 
SQL> column email_address format a40 
SQL> column substr_result format a30 
SQL> SELECT email_address 
    2  , regexp_substr(email_address,'[a-zA-Z0-9._%-][email protected][a-zA-Z0-9._%-]+\.[a-zA-Z]{2,4}') substr_result 
    3 FROM email 
    4/

EMAIL_ADDRESS       SUBSTR_RESULT 
---------------------------------------- ------------------------------ 
[email protected]       [email protected] 
[email protected]        [email protected] 
[email protected]      [email protected] 
[email protected]_domaindotorg 

Используя те же данные, вот запрос, который ограничивает только действительные адреса электронной почты, используя REGEXP_LIKE

SQL> column email_address format a40 
SQL> column substr_result format a30 
SQL> SELECT email_address 
    2 FROM email 
    3 WHERE REGEXP_LIKE (email_address, '[a-zA-Z0-9._%-][email protected][a-zA-Z0-9._%-]+\.[a-zA-Z]{2,4}'); 

EMAIL_ADDRESS 
---------------------------------------- 
[email protected] 
[email protected] 
[email protected] 

Поиск по странице содержимого SQL Reference для регулярного выражения, чтобы увидеть поддержку регулярных выражений.

+2

Это регулярное выражение не будет работать для адресов электронной почты, использующих TLD .museum и .travel. –

+0

адвокат @ Lawrence @ Andrea.com передает это регулярное выражение, и не должен –

4

еще лучше регулярное выражение:

^[a-zA-Z0-9._%-][email protected][a-zA-Z0-9._%-]+\.[a-zA-Z]{2,4}$ 

(такое же выражение дано, но якорь, чтобы начать (^) и конец ($) линии)

без якорей, такие выражения, как «test1 @ hotmail.com какой-либо другой текст ' будет подтвержден и, если вы пытаетесь проверить один адрес электронной почты, указанная строка не должна быть подтверждена

Примечание. : электронное письмо должно быть предварительно обрезано так, чтобы ведущие или конечные пробелы не испортили проверку.

Надеется, что это помогает,

2

Будь осторожен в '.' характере: это джокер (как * или % в синтаксисе SQL). Вы должны извлечь его с помощью '\'.

Вот регулярное выражение я использую, чтобы соответствовать RFC2822 (возможно не во всех случаях :)):

'^[a-zA-Z0-9!#$%''\*\+-/=\?^_`\{|\}~][email protected][a-zA-Z0-9._%-]+\.[a-zA-Z]{2,4}$' 
-1
declare 

-- where customer is the table in my case 

email_input customer.email%type; 

begin 

    email_input:=:EMAIL; 
    IF email_input is not null 
    AND email_input not like '%@%.COM' then 
     message('Please enter a valid email address!'); 
     message(' '); 
     clear_message; 
     :EMAIL:=null; 
     raise form_trigger_failure; 
    end if; 
end;