09 September 2006

Email Validation On Constraint Level Using Regular Expressions In Oracle

Email artık hayatın vazgeçilmezlerinden biri oldu. Birçok uygulama en basitinden üye kayıt için email doğrulaması gerektiriyor. Bu da uygulama geliştiricilerin bu adresler ile olan ilişkisini daha bir arttırdı.
Genelde business layer tarafında yapılan doğrulama işlemlerini data layer tarafına da kaydırmak yapılagelen bir durumdur. NULL olmama gibi kontroller veritabanı düzeyinde sıkça yapılmasına rağmen daha karmaşık kısıtlar için veritabanını kullanmaz birçok geliştirici.
Oracle, kendi içinde barındırdığı regular expression desteği ile artık birçok karmaşık text tabanlı işlemi yapılabilmektedir. Bunun nasıl yapıldığını aşağıdaki örnekte basitçe anlatmaya çalıştım.
Email kontrolü için yazılan doğrulama, oldukça basittir. Sadece @ ve . karakterlerinden önce ve sonra bir veya birden fazla karakterin gelmesi gerektiğini belirtmektedir.

Connected to Oracle Database 10g Express Edition Release 10.2.0.1.0
Connected as SYS


SQL>
SQL> create table email_test( id number, email varchar2(128));

Table created
SQL> alter table email_test add constraint email_validate_ck check( regexp_like( email, '^.+[@].+[\.].+$' ));
Table altered
SQL> INSERT INTO  email_test VALUES(1, 'waa@aaa.com.tr');
1 row inserted
SQL> INSERT INTO  email_test VALUES(1, 'waaaaa.com');
INSERT INTO  email_test VALUES(1, 'waaaaa.com')
ORA-02290: check constraint (SYS.EMAIL_VALIDATE_CK) violated
SQL>
Regular Expression, Oracle'ye 10G ile gelen bir özelliktir.

Düz PL/SQL ile ise
DECLARE
  email VARCHAR2(32);
  i     NUMBER;
  k     NUMBER;
  part1 VARCHAR2(32);
  part2 VARCHAR2(32);
BEGIN
  email := 'mennan.mennan.men.na';
  dbms_output.put_line('Email is ' || email);
 
  i     := instr(email, '@');
  part1 := substr(email, 1, i - 1);
  email := substr(email, i + 1);
 
  k     := instr(email, '.', 1);
  part2 := substr(email, 1, k - 1);
  email := substr(email, k + 1);
 
  IF i * k = 0 THEN
    dbms_output.put_line('Invalid -->> (@) or (.) not found');
  ELSIF nvl(length(part1), 0) * nvl(length(part2), 0) *
        nvl(length(email), 0) = 0 THEN
    dbms_output.put_line('Invalid -->> Length problem');
  ELSE
    dbms_output.put_line('Email suppose to be valid...');
  END IF;
 
END;



Çıktı ise
Email is mennan@mennan.men.na
Email suppose to be valid...
 
Email is mennan@.men.na
Invalid -->> Length problem
 
Email is mennan.mennan.men.na
Invalid -->> (@) or (.) not found

No comments: