Tratando de validar direcciones de correo electrónico usando expresiones regulares

Traducción del post original publicado en Julio 10 2013.

Después de mi presentación en Kscope13, uno de los asistentes se me acercó a preguntarme si alguna vez había tratado de validar direcciones de correo electrónico utilizando expresiones regulares. Ésta persona no había escuchado sobre expresiones regulares antes de la presentación y me contó que en su trabajo estaba tratando de crear una función PL/SQL (la cual se estaba volviendo muy compleja) que se encargara de dicha funcionalidad. Le ofrecí ver si podía lograr algo y escribir una entrada en el blog.

Después de algunos intentos y de entender que no es una tarea sencilla, me decidí por la siguiente expresión regular: ^[a-z0-9._-]+@[a-z0-9.-]+\.[a-z]{2,3}$

En éste caso, yo considero que una dirección de correo electrónico es correcta si la misma empieza con una secuencia de caracteres que puede incluir cualquier letra o dígito, el punto, el guión o el guión bajo, a continuación el símbolo @ seguido por una secuencia de caracteres que puede incluir cualquier letra o dígito, el  punto o el guión y finalizando con un punto seguido de una secuencia de caracteres que contiene entre dos y tres letras.

Está claro que una dirección de correo electrónico puede contener otros caracteres; pero decidí utilizar aquellos que se ven con mayor frecuencia. No hay que olvidar que ésta expresión regular solamente considera letras minúsculas y que podemos pasar un parámetro a las funciones regexp en SQL para indicar que deseamos validar direcciones sin importar si las letras son mayúsculas o minúsculas.

Veamos cómo funciona todo utilizando datos que se encuentran en una tabla de clientes:

SQL> select * from clients;

NAME_CLIENT               PHONE                EMAIL
------------------------- -------------------- ------------------------------
FOUNTAIN,VICKIE L                              Vickie.L.Fountain@mail.com
ORTIZ,GENOVEVA M                               123ortiz.gmail.com
MALDONADO,TERESA                               teresa-maldonado@amazon.store
BARAJAS-RAMIREZ,AMY
SERRANO,GRACE
BALDA GALO                (512) 254-1694       galo@email.mydomain.net

6 rows selected.

Se puede observar que las direcciones de correo que siguen el patrón de la expresión regular pertenecen a los registros 1 y 6 y que las direcciones de correo en los registros 2 y 3 no siguen el patrón.

Podemos utilizar la siguiente sentencia SQL para encontrar los registros que siguen el patrón definido en la expresión regular:

SQL> select *
  2 from clients
  3 where regexp_like (email,'^[a-z0-9._-]+@[a-z0-9.-]+\.[a-z]{2,3}$','i');

NAME_CLIENT               PHONE                EMAIL
------------------------- -------------------- ------------------------------
FOUNTAIN,VICKIE L                              Vickie.L.Fountain@mail.com
BALDA GALO               (512) 254-1694        galo@email.mydomain.net

2 rows selected.

Se debe notar que la primera dirección de correo es considerada correcta a pesar de que no se definieron caracteres en mayúsculas en la expresión regular. Ésto ocurre debido al uso del parámetro ‘i’ en la función, lo que le indica que no importa si los caracteres están en mayúsculas o minúsculas.

Ahora busquemos los registros que no siguen el patrón definido en la expresión regular:

SQL> select *
  2 from clients
  3 where not regexp_like (email,'^[a-z0-9._-]+@[a-z0-9.-]+\.[a-z]{2,3}$','i');

NAME_CLIENT               PHONE                EMAIL
------------------------- -------------------- ------------------------------
ORTIZ,GENOVEVA M                               123ortiz.gmail.com
MALDONADO,TERESA                               teresa-maldonado@amazon.store

2 rows selected.

En éste caso, la primera dirección de correo no sigue el patrón definido en la expresión regular ya que falta la @. La segunda dirección utiliza un dominio formado por cuatro letras pero el patrón que estamos tratando de validar lo limita a dos o tres letras.

En resumen, éstos ejemplos muestran cómo empezar a realizar validaciones de direcciones de correo electrónico usando expresiones regulares. El patrón utilizado es bien básico, no es perfecto y puede ser mejorado; pero siempre dependerá del formato (o los formatos) de direcciones de correo electrónico que se desee validar y la complejidad de su representación.

Espero que les sea de ayuda.

Anuncios

¿Cómo conectarse a una PDB usando Oracle EM Express?

Traducción del post original publicado en Agosto 1 del 2013.

Cuando instalamos Oracle 12c, tenemos la opción de utilizar la nueva arquitectura multitenant. La configuración por defecto de EM Express solamente permite conectarse a la CDB mediante el URL https://hostname:5500/em

Lo anterior se puede confirmar revisando el nombre de la base de datos (ora12cr1) que se muestra en la esquina superior izquierda.

em_exp_cdb

Para poder conectarnos a una PDB usando EM Express, primero debemos asegurarnos que la PDB se encuentre abierta y luego procedemos a configurar un nuevo puerto HTTPS utilizando el procedimiento DBMS_XDB_CONFIG.SETHTTPSPORT().

C:\Users\gbalda>sqlplus

SQL*Plus: Release 12.1.0.1.0 Production on Thu Aug 1 21:14:17 2013

Copyright (c) 1982, 2013, Oracle. All rights reserved.

Enter user-name: sys as sysdba
Enter password:
Last Successful login time: Thu Aug 01 2013 21:08:44 -05:00

Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> show user
USER is "SYS"
SQL> alter session set container = ora12cpdb1
 2 ;

Session altered.

SQL> select name, open_mode from v$pdbs;

NAME OPEN_MODE
------------------------------ ----------
ORA12CPDB1 MOUNTED

SQL> alter pluggable database open read write;

Pluggable database altered.

SQL> select name, open_mode from v$pdbs;

NAME OPEN_MODE
------------------------------ ----------
ORA12CPDB1 READ WRITE

SQL> select dbms_xdb_config.gethttpsport from dual;

GETHTTPSPORT
------------
SQL> exec dbms_xdb_config.sethttpsport(5501);

PL/SQL procedure successfully completed.

El URL para conectarse a la PDB es https://hostname:5501/em y se puede confirmar que la información mostrada pertenece a la PDB si revisamos el nombre (ora12cpdb1) que se encuentra en la esquina superior izquierda.

em_exp_pdb

El mismo proceso se puede repetir para configurar el acceso a otras PDB que se encuentren operativas.


Errores JDBC en SQL Developer 4

Traducción del post original publicado en Julio 14 del 2013.

El día de ayer instalé SQL Developer 4 en una máquina virtual que también contenía Oracle 11g R2 y SQL Developer 3.2.20. No tuve ningún problema durante la instalación; pero el siguiente mensaje de error empezó a aparecer en cuanto hice click en cualquiera de las opciones que requería una conexión a la base de datos.

sqldev4_jdbc_error

Revisando las preferencias de configuración que se encuentran en la sección Database/Advanced, encontré una opción que permite elegir entre el OCI Thick driver o el JDBC Thin driver (de forma implícita). Mi instalación inicial estaba configurada para utilizar el OCI Thick driver como se puede observar en la imagen de abajo.

sqldev4_oci_thick

Todo volvió a la normalidad una vez que desactivé el uso del OCI Thick driver. Ahora la pregunta era, por qué tenía configurada esa opción cuando la opción por defecto es  el JDBC Thin driver.

Después de unos minutos recordé que mi otra versión de SQL Developer (3.2.20) estaba utilizando el OCI Thick driver y que cada vez que uno ejecuta una nueva versión de SQL Developer por primera vez, aparece una ventana preguntando si deseamos copiar las preferencias que tenemos en la versión anterior (lo cual yo hice). Eso explica parte del problema.

Ahora necesito averiguar por qué el OCI Thick driver funciona sin problemas con la versión 3.2.20 y no funciona para nada con la versión 4. A lo mejor That Jeff Smith me puede dar más información al respecto.

Actualización 07/15/2013: Como lo dice Jeff en los comentarios del post en inglés, podemos solucionar el problema si descargamos una versión reciente de la librería ocijdbc11.dll (disponible en el instant client 11.2.0.3 por ejemplo) y la colocamos en el directorio /sqldeveloper/bin.