ORACLE

De WikI de SOMFUEAL (Alfonso Somoza de la Fuente)
Saltar a: navegación, buscar

EJECUCION DE PROCESOS EXTERNOS EN ORACLE

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        <stdio.h>
#include        <stdlib.h>

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

Página Principal