sábado, 8 de enero de 2011

Enviar correo desde la Base de Datos con Oracle XE

Tengo mi viejo notebook con Windows XP, Oracle XE y PL/SQL Developer 8.
Quería hacer una simple prueba, enviar un correo desde Oracle.
Lo primero que hice fue descargar un servidor de correo. Elegí al azar el primero que apareció como resultado de mi búsqueda en Google: Advanced SMTP Server. La instalación y configuración fue sencilla ya que sólo debemos especificar el dominio de nuestro correo y los usuarios desde la siguiente interfaz gráfica:

Todo iba bien hasta que ejecuté mi código. Para ello escribí lo siguiente en una Test Window:

-- Created on 08/01/2011 by C@FKA
declare
NSUBJECT
VARCHAR2(2000);

NMENSAJE VARCHAR2(4000);
VL_CRLF VARCHAR2(2);
vl_conexion UTL_SMTP.CONNECTION;
VL_MENSAJE
VARCHAR2(4000);


begin
-- Test statements here
nSubject:='Prueba de Envio de Correo desde Oracle';

nMensaje:='Esto no ha sido nada fácil!!!!';
vl_crlf:=CHR( 13 ) || CHR( 10 );

vl_conexion := UTL_SMTP.OPEN_CONNECTION('dominio.com',25);
UTL_SMTP.HELO (vl_conexion,'dominio.com');

UTL_SMTP.MAIL (vl_conexion,'cafka@dominio.com');

UTL_SMTP.RCPT (vl_conexion,'cafka@dominio.com');
vl_mensaje := 'Subject: ' || nSubject || vl_crlf;
vl_mensaje := vl_mensaje || vl_crlf || nMensaje || vl_crlf ;

UTL_SMTP.DATA(vl_conexion,vl_mensaje);

UTL_SMTP.QUIT(vl_conexion);
end;

Luego de ejecutarlo, me encuentro con el primero de varios errores que se fueron sucediendo: pls-00201 identifier utl_smpt must be declared.
Esto significa que el package utl_smtp no está instalado.
Para instalarlo debemos ejecutar el archivo utlsmtp.sql que viene con las
instalación de Oracle y que se encuentra (en mi caso) en C:\oraclexe\app\oracle\product\10.2.0\server\RDBMS\ADMIN. Lo importante aquí es el usuario con el que se ejecuta este archivo. DEBE SER sys y NO system (esto está especificado al principio del script). En mi caso también faltaba instalar el package utl_tcp así que desde SQL*Plus ejecuté lo siguiente:

SQL> connect as sysdba
Enter user-name: sys

Enter password:

Connected.

SQL> @C:\oraclexe\app\oracle\product\10.2.0\server\RDBMS\ADMIN\utltcp.sql

Package created.

Grant succeeded.
Synonym created.


SQL> @C:\oraclexe\app\oracle\product\10.2.0\server\RDBMS\ADMIN
\utlsmtp.sql
Package created.

Grant succeeded.
Synonym created.


Si esto se ejecuta con el usuario system, no se generan los packages bodies y al ejecutar el código da el siguiente error: oracle-04067 not executed, package body UTL.SMPT does not exist. Cuando intentamos crear los packages utl_smpt o utl_tcp con un usuario distinto a sys nos da el siguiente error:

SQL> @C:\oraclexe\app\oracle\product\10.2.0\server\RDBMS\ADMIN\utltcp.sql
Package created

GRANT EXECUTE ON sys.utl_tcp TO PUBLIC
ORA-00942: table or view does not exist
Synonym created

Estuve recorriendo muchos Foros en este camino, en muchos decían que la solución era dar permisos sobre el package utl_smpt al usuario que ejecuta el código. Este no es nuestro caso ya que al final del utlsmtp.sql se ejcuta la siguiente línea que asegura la ejecución para todo usuario:

GRANT EXECUTE ON sys.utl_smtp TO PUBLIC;

Luego de algunas horas el correo llegó a destino, aún no muestra quién lo envía pero es un detalle menor que veré luego...




jueves, 6 de enero de 2011

JavaScript - Capturar tecla Enter

Tengo un formulario con un botón "Aceptar" que realiza el submit. Cuando se presiona este botón se realizan ciertas validaciones sobre los datos ingresados. Lo que sucedía era lo siguiente: si se presionaba la tecla Enter, se realizaba el submit pero no las validaciones. Decidí deshabilitar este evento de la siguiente forma:


<html>
<body>

<script type="text/javascript">
// Capturo Enter
document.onkeypress=function(e){
var esIE=(document.all);
tecla=(esIE) ? event.keyCode : e.which;
return (tecla!=13);
};
</script>

<form name="form" action="http://www.w3schools.com/">
<table>
<tr>
<td> Ingrese un campo </td>
<td><input type="text" name="entrada" /></td>
</tr>
<tr>
<td><input type="button" name="Aceptar" value="Aceptar" onclick='javascript:submit()'/></td>
</tr>
</table>
</form>
</body>
</html>


Como siempre, pueden probar este codigo en http://www.w3schools.com/js/tryit.asp?filename=tryjs_intro.