terça-feira, 15 de março de 2011

Enviando e-mails utilizando o banco de dados Oracle

O banco de dados Oracle desde as versões mais antigas (a partir da versão 8i) oferece uma opção para 
DBA´s e desenvolvedores permitir que as aplicações possam enviar mensagens dentro de seus códigos PL/SQLs. Imagine, então as diversas necessidades no mundo dos negócios para o envio de e-mails durante a geração de relatórios, fechamentos de compras, confirmação de pedidos, diversos scripts de monitoração do banco de dados entre outros, sendo realizadas dentro do próprio banco de dados.

Mas, como utilizar esse dispositivo ?

Este artigo irá demonstrar como utilizar essa funcionalidade.

 

Devem-se utilizar os packages UTL_SMTP e UTL_TCP. DBAs ou desenvolvedores poderão escrever uma rotina para empregar estas packages internas e chamá-las eventualmente em todos os lugares aplicáveis nos sistemas. As mensagens poderão ser enviadas sempre que um evento ocorrer ou poderão ser programadas como um JOB (usando a package DBMS_JOB ou DBMS_SCHEDULER  – ver o artigo “Schedulando processos no Oracle”).


Itens importantes para a execução desta tarefa.

1.       O nome do servidor de e-mail “hostname” ou o endereço IP. Este servidor poderá ser de uma intranet ou de um serviço remoto que esteja disponível. A palavra “localhost” pode ser usada para chamar o Oracle a usar o serviço “default” para o Sistema Operacional (SMTP).

2.       O sistema operacional deverá suportar os serviços de SMTP. A maioria dos Unix/Linux suportam este serviço. Para os Windows , verificar se o serviço de SMTP encontra-se disponível.

3.       O serviço irá utilizar uma porta para comunicar-se com o SMTP. Normalmente o valor “default” da porta é o 25.

4.       O banco de dados deverá ter os serviços de Java habilitados. A opção do Jserver deverá ser instalada usando os scripts (initjvm.sql e initplsj.sql). Normalmente o  Jserver é auto instalado em versões Oracle Enterprise.

5.       A package UTL_SMTP deverá existir na base e o seu “owner”  deverá ser o usuário SYS.



Fazer as adaptações do código exemplo e compilar em sua base de dados.

create or replace PROCEDURE send_mail(
sender IN VARCHAR2,
recipient IN VARCHAR2,
subject IN VARCHAR2,
message IN VARCHAR2)
IS
mailhost VARCHAR2(30) := '200.32.0.0';  --> INFORMAR O SERVIDOR DE SMTP
mail_conn utl_smtp.connection;
crlf VARCHAR2( 2 ):= CHR( 13 ) || CHR( 10 );
mesg VARCHAR2( 1000 );

BEGIN
      mail_conn := utl_smtp.open_connection(mailhost, 25);

      mesg:= 'Date: ' || TO_CHAR( SYSDATE, 'dd Mon yy hh24:mi:ss' ) || crlf ||
             'From: <'||sender||'>' || crlf ||
             'Subject: '||subject || crlf ||
             'To: '||recipient || crlf ||
             'ENVIANDO E-MAIL UTILIZANDO ORACLE !!'||crlf||
             ' '||crlf||
             'CORPO DA MENSAGEM... COLOQUE AQUI SUA MENSAGEM !'||crlf||
             'CORPO DA MENSAGEM... COLOQUE AQUI SUA MENSAGEM !'||crlf||
             'CORPO DA MENSAGEM... COLOQUE AQUI SUA MENSAGEM !'||crlf||
             ' '||crlf||message;
      utl_smtp.helo(mail_conn, mailhost);
      utl_smtp.mail(mail_conn, sender);
      utl_smtp.rcpt(mail_conn, recipient);
      utl_smtp.data(mail_conn, mesg);
      utl_smtp.quit(mail_conn);

      Exception
      WHEN OTHERS THEN
        raise_application_error(-20002,'unable to send the mail.'||SQLERRM);
END;
/

show errors;


Para executar a procedure acima utilizar:

execute send_mail('e_mail_destino@seu_dominio.com.br',
'seu.email@seu_dominio.com.br',
'Mensagem Enviada pelo Oracle Database !',
'DIGITAR MENSAGEM !!');

Erros mais comuns

Se o serviço de SMTP não estiver disponível, será apresentada a seguinte mensagem de erro:
ORA-20001: 421 Service not available

Se os objetos Java não estiverem instalados corretamente, será apresentada a mensagem de erro:
ORA-29540: class oracle/plsql/net/TCPConnection does not exist

Descrição das rotinas da package UTL_SMTP


Procedures
Descrição
UTL_SMTP.OPEN_CONNECTION:
Abre uma conexão para um servidor de SMTP.
UTL_SMTP.HELO:
Inicializa o serviço  “handshake”.
UTL_SMTP.MAIL:
Inicializa a transação de envio do e-mail para o servidor.
UTL_SMTP.RCPT:
Especifica o nome do recipiente.
UTL_SMTP.DATA:
Especifica o corpo da mensagem.
UTL_SMTP.OPEN_DATA / UTL_SMTP.WRITE_DATA / UTL_SMTP.CLOSE_DATA:  
Especifica o corpo da mensagem com maiores controles.
UTL_SMTP.VRFY:
Verifica a validade dos endereços.

Principais limitações

Elementos
Limitações
user
O tamanho máximo do nome do usuário é de 64 caracteres.
domain
O tamanho total do nome do domínio ou endereço IP é 64 caracteres.
path
O tamanho máximo do caminho “path” é de 256 caracteres (incluindo a pontuação e elementos separadores).
command line
O tamanho máximo da linha de comando incluindo o  é de 512 caracteres.
reply line
O tamanho máximo de linha de resposta incluindo o  é de 512 caracteres.
text line
O tamanho máxiom da linha de texto incluindo o  é de 1.000 caracteres.
recipients buffer
O tamanho máximo do buffer é de 100 recipientes.


Rubens Oliveira
DBA Oracle Consultor
olivert.dba@consultant.com


sexta-feira, 4 de março de 2011

Instalação do Oracle 11gR2 no sistema operacional Oracle Enterprise Linux Server 4

Este artigo descreve a instalação do Banco de dados Oracle 11gR2 numa máquina virtual (VMWare) rodando o Oracle Linux Enterprise Server versão 4.0 (32-Bits).

1. Instalação do sistema operacional.
Para obter o Oracle Linux, acessar o link: https://edelivery.oracle.com/linux, faça o cadastramento solicitado e o link será disponibilizado, os passos para a instalação do sistema operacional não serão abordados nesse artigo.
Durante a instalação criar um usuário para a instalação dos binários Oracle.

2. Depois do sistema operacional instalado deve-se criar os grupos seguindo as recomendações abaixo:
Conectar-se com usuario "root" e executar os comandos abaixo:

[root@localhost sbin]# groupadd oinstall
[root@localhost sbin]# groupadd dba
[root@localhost sbin]# groupadd nobody
[root@localhost sbin]# usermod -G oinstall,dba oracle
[root@localhost sbin]# id oracle
[root@localhost sbin]# uid=500(oracle) gid=500(oracle)grupos=500(oracle),501(oinstall),502(dba)
[root@localhost sbin]# usermod -g nobody nobody
[root@localhost sbin]# id nobody
[root@localhost sbin]# uid=99(nobody) gid=99(nobody) grupos=99(nobody)

3. Conectado como "root", deve-se editar o arquivo /etc/sysctl.conf adicionando os seguintes parâmetros no final do arquivo.

LEMBRE-SE: De fazer uma cópia de segurança antes de fazer os ajustes!

kernel.shmall = 2097152
kernel.shmmax = 536870912
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 6815744
fs.aio-max-nr = 1048576
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default=4194304
net.core.wmem_default=262144
net.core.rmem_max=4194304
net.core.wmem_max=1048576

4. Conectado como "root", execute o comando abaixo para aplicar os novos parâmetros de kernel.

[root@localhost sbin]# /sbin/sysctl -p

5. Conectado como "root" edite o arquivo /etc/security/limits.conf e adicione novos limites para o sistema.

LEMBRE-SE: De fazer uma cópia de segurança antes de fazer os ajustes!

root@localhost sbin]# vi /etc/security/limits.conf
* soft nproc 2047
* hard nproc 16384
* soft nofile 1024
* hard nofile 65536

6. Conectado como "root", executar os comandos para configurar o ambiente para a instalação do Oracle.

root@localhost sbin]# ln -s /usr/bin/awk /bin/awk
root@localhost sbin]# ln -s /usr/bin/rpm /bin/rpm
root@localhost sbin]# ln -s /lib/libgcc_s.so.1 /lib/libgcc_s.so
root@localhost sbin]# ln -s /usr/bin/basename /bin/basename
root@localhost sbin]# mkdir /oracle
root@localhost sbin]# mkdir /oracle/11g
root@localhost sbin]# chown -R oracle:oinstall /oracle
root@localhost sbin]# chmod -R 775 /oracle

7. Instalar os pacotes básicos do Oracle Enterprise Linux.

Pacotes exigidos:

compat-libstdc-33-3.2.3-61
elfutils-libelf-0.125-3.el5
elfutils-libelf-devel-0.125-3.el5
glibc-2.5-12
glibc-devel-2.5-12
glibc-common-2.5-12
gcc-4.1.1-52.el5
gcc-c-4.1.1-52.el5
libgcc-4.1.1-52.el5
libaio-0.3.106-3.2
libaio-devel-0.3.106-3.2
libstdc-4.1.1-52.el5
libstdc-devel-4.1.1-52.el5
unixODBC-2.2.11-7.1
unixODBC-devel-2.2.11-7.1
sysstat-7.0.0-3.el5
binutils-2.17.50.0.6-2.el5
make-3.81-1.1

Habitualmente esses pacotes encontram-se disponíveis no caminho: [/media/cdrom/Enterprise/RPMS], caso os pacotes não estejam disponíveis no CD de instalação, pode-se baixá-los acessando o link abaixo:



Escolha a versão 4 ou 5 conforme sua instalação, pode ser que alguns pacotes não estejam disponíveis na versão 4.

7.1. Para verificar a instalação dos pacotes utilizar o comando abaixo.

rpm -q compat-libstdc-33-3.2.3-61 elfutils-libelf-0.125-3.el5 elfutils-libelf-devel-0.125-3.el5 glibc-2.5-12 glibc-devel-2.5-12 glibc-common-2.5-12 gcc-4.1.1-52.el5 gcc-c-4.1.1-52.el5 libgcc-4.1.1-52.el5 libaio-0.3.106-3.2 libaio-devel-0.3.106-3.2 libstdc-4.1.1-52.el5 libstdc-devel-4.1.1-52.el5 unixODBC-2.2.11-7.1 unixODBC-devel-2.2.11-7.1 sysstat-7.0.0-3.el5 binutils-2.17.50.0.6-2.el5 make-3.81-1.1

7.2. Caso os pacotes não estejam instalado utilizar o comando abaixo.

rpm -ivh compat-libstdc-33-3.2.3-61 elfutils-libelf-0.125-3.el5 elfutils-libelf-devel-0.125-3.el5 glibc-2.5-12 glibc-devel-2.5-12 glibc-common-2.5-12 gcc-4.1.1-52.el5 gcc-c-4.1.1-52.el5 libgcc-4.1.1-52.el5 libaio-0.3.106-3.2 libaio-devel-0.3.106-3.2 libstdc-4.1.1-52.el5 libstdc-devel-4.1.1-52.el5 unixODBC-2.2.11-7.1 unixODBC-devel-2.2.11-7.1 sysstat-7.0.0-3.el5 binutils-2.17.50.0.6-2.el5 make-3.81-1.1

8. Verificar a área de livre para o (/tmp), para a instalação serão necessários 2 GB para essa área.

root@localhost sbin]# df -k /tmp

9. Verificar a área de espaço para o "swap".

root@localhost sbin]# grep SwapTotal /proc/meminfo

10. Verificar a quantidade de RAM disponível.

root@localhost sbin]# grep MemTotal /proc/meminfo

Nota:
Durante a instalação o total de memória disponível não poderá ser menor que 900 MB, caso isso ocorra a instalação poderá falhar, o indicado é ter pelo menos 1 GB, para passar na verificação durante a instalação e concluir a mesma com sucesso.

11. Edite o arquivo /home/oracle/.bashrc e adicione as varáveis de ambiente necessárias para executar o banco

root@localhost sbin]# vi /home/oracle/.bashrc
export ORACLE_BASE=/oracle
export ORACLE_HOME=/oracle/11g
export ORACLE_SID=orcll
export PATH=$PATH:$ORACLE_HOME/bin

12. Realize um FTP para o servidor linux dos binários Oracle:

linux_11gR2_database_1of2.zip e linux_11gR2_database_2of2.zip

Nota:
Os binários do banco de dados Oracle 11gR2 podem ser obtidos no site da Oracle.

13. Descompacte os arquivo que foram carregaso no servidor, usando o comando abaixo.

unzip linux_11gR2_database_1of2.zip
unzip linux_11gR2_database_2of2.zip

14. Para iniciar a instalação, vá para o caminho onde os binários foram descompactados e execute o arquivo runInstaller.

oracle@localhost]$ ./runInstaller

Importante !
Para a chamada do instalador deve-se ter habilitado uma interface gráfica, caso não esteja habilitada deve-se ter um emulador gráfico para uso ou habilitar no próprio Linux (Gnome, KDE, entre outros) durante a instalação o assistente realizará as verificações necessárias do sistema operacional, já realizadas nos passos acima, e também ao término solicitará que sejam executados os seguintes arquivos orainstRoot.sh e root.sh, quando solicitado abra um terminal e execute o script (esta execução deverá ser executada conectado como "root").


Rubens Oliveira
DBA Oracle Consultor
olivert.dba@consultant.com