Por seguridad, desde PL/SQL no es posible ejecutar comandos de servidor que hospedar la Base de datos Oracle,
si bien oracle nos permite llamar a procedimientos externos mediante el servicio extproc, para que este servicio
funciones necesitamos hacer unos retoques en los ficheros de alias de servicios y de los listener, para poder
levantar otro escuchador (listener) para el servicio externo.
Este ejemplo es para un Base de datos oracle9i Enterprise Edition Release 9.2.0.4.0 alojada en una plataforma
Red Hat Enterprise Linux 4
------------------------------------------------------------------------------------------------
Comprobar que exixte extproc en $ORACLE_HOME/bin/
bartola>$which extproc
------------------------------------------------------------------------------------------------
Editamos el $ORACLE_HOME/network/admin/listener.ora y añadimos esta lineas
LISTENER9IPRG =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS =
(PROTOCOL = IPC)
(KEY = extproc) # coincidir en el tnsnames.ora
)
)
)
)
SID_LIST_LISTENER9IPRG =
(SID_LIST =
(SID_DESC =
(SID_NAME = extproc) # coincidir en el tnsnames.ora
(ORACLE_HOME= /opt/oracle/product/9.2.0) # El $ORACLE_HOME
(PROGRAM = extproc) # ojo comprobar que esta en $ORACLE_HOME/bin
(ENVS="EXTPROC_DLLS=ANY") # Para Versiones superiores a Oracle8i (ojo comillas)
)
)
------------------------------------------------------------------------------------------------
Editamos el $ORACLE_HOME/network/admin/sqlnet.ora y añadimos si no esta
NAMES.DEFAULT_DOMAIN=world
------------------------------------------------------------------------------------------------
Editamos el $HOME_ORACLE/network/admin/tnsnames.ora y añadimos el alias
EXTPROC_CONNECTION_DATA.world =
(DESCRIPTION =
(ADDRESS =
(PROTOCOL = IPC)
(KEY = extproc) # coincidir en el listener.ora
)
(CONNECT_DATA =
(SID = extproc) # coincidir en el listener.ora
)
)
------------------------------------------------------------------------------------------------
Incluir en el /etc/rc.d/init.d/oracle el servicio configurado anteriormente
#! /bin/bash
# este Script se llama oracle
# chkconfig: 2345 98 04
# description: start and stop Oracle Sevicios
#
# /etc/rc.d/init.d
#
# Para crear los link chkconfig --add oracle
case "$1" in
'start')
# Arranque de la Base de Datos
echo "Arrancando la Base de Datos"
su - oracle -c "dbstart"
echo "Arrancando Listener"
su - oracle -c "lsnrctl start LISTENER"
su - oracle -c "lsnrctl start LISTENER9IPRG" # Arracar el escuchador externo
;;
'stop')
# Parada de Base de Datos
echo "Parando listener"
su - oracle -c "lsnrctl stop LISTENER"
su - oracle -c "lsnrctl stop LISTENER9IPRG" # para el escuchado externo
echo "Parando Base de Datos"
su - oracle -c "dbshut"
;;
esac
------------------------------------------------------------------------------------------------
Ahora creamos un ejemplo que que perminte enviar correo electronico desde un PL/SQL que llama al comando mailx de sistema operativo pasandole los parametros oportunos.
------------------------------------------------------------------------------------------------
Editamos un programa (correo.c) en un directorio conocido /home/oracle/LIB por ejemplo
#include
#include
PB_MAIL(v_asunto,v_email,v_ecuerpo)
char *v_asunto;
char *v_email;
char *v_ecuerpo;
{
char s_comando[3000];
sprintf (s_comando, "/bin/echo %s | /bin/mailx -s %s %s",v_ecuerpo, v_asunto, v_email);
system(s_comando);
}
------------------------------------------------------------------------------------------------
Desde la linea de comados creamos la libreria compartida que compartiremos con ORACLE Cuando se crea una libreria dinamica es necesario que código objeto (correo.so) sea independiente de la posición, para conseguir este tipo de código debe especificarse al compilador la opción -fPIC (Position Independent Code) otra opcion es -shared que permite que la el codifigo sea compartido.
bartola>$gcc -fPIC -shared -o correo.so correo.c
bartola>$chmod 755 correo.so
------------------------------------------------------------------------------------------------
El oracle damos permisos para crea LIBRERIAS al esquema que nos interese ejemplo CARTOGRAFIA
bartola>$sqlplus system/password
SQL>GRANT CREATE LIBRARY TO CARTOGRAFIA;
------------------------------------------------------------------------------------------------
Creamos la libreria compartida para el esquema en cuestion
bartola>$sqlplus cartografia/password
SQL>DROP LIBRARY correo; -- borrar si existe
SQL>CREATE LIBRARY correo AS '/home/oracle/LIB/correo.so'; -- directorio en donde esta el .so
SQL>select * from user_libraries; -- Comprobar que esta Creada
------------------------------------------------------------------------------------------------
Creamos un proceso pb_mail.sql para empaquetar la llamada a la libreria comun
fichero pb_mail.sql:
CREATE OR REPLACE PROCEDURE pb_mail (asunto IN varchar2,
email IN varchar2,
ecuerpo IN varchar2)
AS EXTERNAL
LIBRARY CORREO
NAME PB_MAIL
PARAMETERS(asunto STRING,
email STRING,
ecuerpo STRING);
/
show errors;
exit
Compilamos el proceso en el esquema en cuestion
bartola>$sqlplus cartografia/password @pb_mail.sql
------------------------------------------------------------------------------------------------
Creamos un Script en PL/SQL llamado lanzar.sql par comprobar la bondad de lo que hemos hecho
Fichero lanzar.sql
declare
asunto varchar2(30):='Poeta';
email varchar2(30):='somfueal@telefonica.net';
ecuerpo varchar2(100):='Quien domina la informacion domina la situacion';
begin
pb_mail(asunto,email,ecuerpo);
end;
/
exit
------------------------------------------------------------------------------------------------
Y por ultimo lo ejetutamos:
bartola>$sqlplus cartografia/password @lanzar.sql
------------------------------------------------------------------------------------------------
Editado por Alfonso Somoza de la Fuente
E-Mail: somfueal@gmail.com
No hay comentarios:
Publicar un comentario