2009-04-24 4 views

Répondre

1

Si vous êtes seulement préoccupé par les États-Unis, il existe plusieurs sources de codes postaux que vous pouvez obtenir en format fichier plat et d'importation dans une table, et ensuite appliquer une contrainte de clé étrangère dans votre adresses à cette table.

Les adresses électroniques peuvent être comparées à une expression régulière (nécessite 10g ou plus) pour valider le format, mais vérifier si elles sont des adresses réelles est une tâche beaucoup plus difficile.

+0

merci, thats utile - je viens suis tombé sur quelques informations d'oracle qui lie avec votre 10g ou Conseil de vérification de l'expression reg plus élevée - http://www.oracle.com/technology/oramag/webcolumns/2003/techarticles/rischert_regexp_pt2.html –

+0

@oej le lien ci-dessus a été supprimé –

7

est ici la syntaxe regexp une adresse e-mail, y compris les citations

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

Vous pouvez utiliser regexp_like() dans une clause where ou regexp_substr() pour vérifier si votre champ contient une adresse e-mail valide. Voici un exemple: vous verrez que regexp_substr() renvoie NULL sur l'adresse manquant le .domain, ce qui échoue à la validation de la sous-chaîne. De là, vous pouvez construire une contrainte de vérification autour d'elle ou de faire exécuter à l'aide d'un déclencheur (beurk), etc.

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 

En utilisant les mêmes données, voici une requête qui limite uniquement les adresses e-mail valides, en utilisant REGEXP_LIKE

Recherchez la page de contenu du SQL Reference pour regexp pour voir le support d'expression régulière.

+2

Cette regexp ne fonctionnera pas pour les adresses e-mail qui utilisent les TLD .museum et .travel. –

+0

conseil @ Lawrence @ Andrea.com passe cette expression régulière, et ne devrait pas –

4

encore mieux expression régulière est:

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

(même expression donnée mais ancré pour commencer (^) et à la fin ($) de la ligne)

sans les ancres, des expressions comme « test1 @ hotmail.com un autre texte ' serait validé et, si vous essayez de valider un e-mail, la chaîne ci-dessus ne devrait pas valider

Note : l'email doit être préalablement rogné afin que les espaces de début ou de fin ne gâchent pas la validation.

Hope it helps,

2

Faites attention au caractère '.': ceci est un farceur (comme * ou % dans la syntaxe SQL). Vous devez l'excuser avec '\'.

Voici le regexp que j'utilise pour correspondre RFC2822 (peut-être pas tous les cas :)):

'^[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;  
Questions connexes