miércoles, 23 de marzo de 2016

Conectar Oracle a SQL-Server

Conectar Oracle a SQL-Server

Esta nota aplica en Solaris Sparc 10, Oralce 11 y 10g.

En algunas ocasiones es necesario obtener datos de terceros desde Oracle, llámese Sybase, SQL-Server, etc. Oracle permite conectarse con otras bases de datos siempre y cuando sea de terceros hacia Oracle, pero restringe la comunicación cuando se trata de Oracle hacia terceros, sin embargo existe una herramienta llamada Oracle Database Gateway que nos permite realizar este tipo de conexiones. Para la instalación de la herramienta necesitamos lo siguiente:

Descargar el kit de Oracle Database Gateway:

Solaris 10 (update 6 or later) 

Como configurar DG4MSQL (Oracle Database Gateway for MS SQL Server) 64bit Unix OS (Linux, Solaris, AIX,HP-UX) post install ( Doc ID 562509.1 ) 

Patch 13390677: 11.2.0.4.0 PATCH SET FOR ORACLE DATABASE SERVER 

- logearse en My Oracle Support 
- Ir a la sección Patches & Updates
- Buscar el  patch number 13390677 y tu plataforma
- Presiona el boton '+' para ver la lista de plataformas 
- click en el patch number 
- Para descargar el kit debes elegir cualquiera de los siguientes casos que apliquen: 

p13390677_112040_platform_5of7.zip - Todos los SO excepto WIndows 32-bit 
p13390677_112040_platform_4of6.zip - Windows 32-bit 

Este kit puede ser instalado en un servidor Oralce, en un Home distinto.

Pasos para instalar Oracle Database Gateway 11g (compatible con 10g).


1.- Crear un directorio nuevo (ORACLE_HOME)

pwd
/opt/oracle/product
mkdir 11_gw

2.- Copiar la carpeta del patch p13390677_112040_platform_5of7.zip en la ruta /opt/oracle/product/11_gw

3.- Descomprimir la carpeta p13390677_112040_platform_5of7.zip

unzip p13390677_112040_SOLARIS64_5of7.zip

4.- Una vez que termine el unzip, se creará la carpeta gateways, ir a la carpeta 

cd geteways

5.- Exportar el DISPLAY

export DISPLAY=100.60.89:0.0

6.- Ejecutar el runInstaller

runInstaller




OUI--Next


OUI--Seleccionar el Directorio creado anteriormente





OUI--Cambiar el Name a OraGt10g_home1


OUI--Revision de prerequisitos





OUI--Seleccionar Gateway for Microsoft SQL Server


OUI--Proporcionar las credenciales de SQL Server










OUI--Ejecutar el root.sh







OUI--Configurar el LISTENER_DG4MSQL

















OUI--Finish




Una vez configurado el Gateway:

1.- Ir a la ruta network del nuevo home

cd /opt/oracle/product/11_gw/network/admin

2.- Configurar/Crear/Modificar el listener.ora

# listener.ora Network Configuration File: /opt/oracle/product/11_gw/network/admin/listener.ora
# Generated by Oracle configuration tools.

LISTENER_dg4msql =
 (ADDRESS_LIST=
      (ADDRESS=(PROTOCOL=tcp)(HOST=100.60.9.120)(PORT=1522))
 )

SID_LIST_LISTENER_dg4msql=
  (SID_LIST=
      (SID_DESC=
         (SID_NAME=dg4msql)
         (ORACLE_HOME=/opt/oracle/product/11_gw)
         (PROGRAM=/opt/oracle/product/11_gw/bin/dg4msql)
      )
  )

#CONNECT_TIMEOUT_LISTENER = 0


3.- Configurar/Configurar/Modificar el tnsnames.ora

# This is a sample tnsnames.ora that contains the NET8 parameters that are
# needed to connect to an HS Agent

dg4msql  =
  (DESCRIPTION=
    (ADDRESS=(PROTOCOL=tcp)(HOST=100.60.9.120)(PORT=1522))
    (CONNECT_DATA=(SID=dg4msql))
    (HS=OK)
  )

4.- Ir a la ruta del protocolo dg4msql

cd /opt/oracle/product/11_gw/dg4msql/admin

5.- Configurar/Configurar/Modificar el listener.ora

# This is a sample listener.ora that contains the NET8 parameters that are
# needed to connect to an HS Agent

LISTENER_dg4msql =
 (ADDRESS_LIST=
      (ADDRESS=(PROTOCOL=tcp)(HOST=100.60.9.120)(PORT=1522))
 )

SID_LIST_LISTENER_dg4msql=
  (SID_LIST=
      (SID_DESC=
         (SID_NAME=dg4msql)
         (ORACLE_HOME=/opt/oracle/product/11_gw)
         (PROGRAM=/opt/oracle/product/11_gw/bin/dg4msql)
      )
  )

#CONNECT_TIMEOUT_LISTENER = 0

6.- Configurar/Configurar/Modificar el tnsnames.ora

# This is a sample tnsnames.ora that contains the NET8 parameters that are
# needed to connect to an HS Agent

dg4msql  =
  (DESCRIPTION=
    (ADDRESS=(PROTOCOL=tcp)(HOST=100.60.9.120)(PORT=1522))
    (CONNECT_DATA=(SID=dg4msql))
    (HS=OK)
  )

7.- Ir a la ruta del home existente en $ORACLE_HOME/network/admin

En este caso particular contaba con un home existente de la version 10g

cd $ORACLE_HOME/network/admin

8.- Configurar/Configurar/Modificar el listener.ora

LISTENER_dg4msql =
 (ADDRESS_LIST=
      (ADDRESS=(PROTOCOL=tcp)(HOST=100.60.9.120)(PORT=1522))
 )

SID_LIST_LISTENER_dg4msql=
  (SID_LIST=
      (SID_DESC=
         (SID_NAME=dg4msql)
         (ORACLE_HOME=/opt/oracle/product/11_gw)
         (PROGRAM=/opt/oracle/product/11_gw/bin/dg4msql)
      )
  )

#CONNECT_TIMEOUT_LISTENER = 0


9.- Configurar/Configurar/Modificar el tnsnames.ora

dg4msql  =
  (DESCRIPTION=
    (ADDRESS=(PROTOCOL=tcp)(HOST=100.60.9.120)(PORT=1522))
    (CONNECT_DATA=(SID=dg4msql))
    (HS=OK)
  )


10.- Volver a cargar el LISTENER_DG4MSQL

lsnrctl reload LISTENER_DG4MSQL


11.- Crear un public database link

CREATE public DATABASE LINK connsql CONNECT TO sa IDENTIFIED BY mypass1 USING 'dg4msql';


12.- Probar la conexión al dblink desde Oracle

select * from dbo.bdSistema@connsql;


Dudas/Comentarios aqui:


miércoles, 16 de marzo de 2016

Enviar SMS Desde Oracle Mediante Un Procedure

Enviar SMS con Procedure

Para enviar SMS mediante procedures en Oracle es necesario contar con un servidor de SMS, en este caso utilizamos https://ww.targetphone.com.mx. Ademas de ello es necesario conocer la cadena de conexión que el servidor utiliza para generar el POST de manera correcta. Cada servidor utiliza cadenas y variables distintas, en la peticion del POST se reconocen a las variables y sus valores separados por un &.


El POST se realiza por medio de la utileria UTL_HTTP de Oracle, como se muestra:


CREATE OR REPLACE PROCEDURE SCHEMA.enviaSMS

  ( numtel   IN VARCHAR2

  , msg      IN VARCHAR2

  )

IS

  cte       VARCHAR2(10) := '44026';

--encpwd    VARCHAR2(100) := '222a2d1l5oe8f5167a55528x45d83719d987b8b88515pc56927ba12cc3eb8931';

--email     VARCHAR2(30) := 'micorreo@miservidor.com';

/* En principio declarando las variables comentadas arriba, deberia funcionar, pero haciendo pruebas, genera caracteres raros al final de las mismas, por lo que la cadena de conexion se ve afectada y no es posible realizar la conexion al servidor de SMS, en este caso el servidor de SMS es el http://targetphone.com.mx, el password encriptado (encpwd) y el correo (email) al final en lugar de terminar como ...8931, termina como 8931F1 sustituyendo el & por F1 y la cadena de conexion muestra lo siguiente al tratar de realizar el POST: ERROR|Parámetros insuficientes. Por ello se dejan en claro y se anexa el & al final como se muestra mas adelante*/
    mtipo     VARCHAR2(10) := 'SMS';
    idivr     NUMBER(5)    := '256';
auxiliar  VARCHAR2(20) := 'pruebax02'; 
/* Las variables declaradas necesarias para la conexion al POST dependen del servidor de SMS, en este caso targetphone en la pestana de Herramientas,Componentes API,HTTP nos muestra los datos necesarios: 
URL de la transacción
    /Controller.php/__a/sms.send.remote.ol.sa 
Método de la transacción
    POST
Petición de ejemplo con formulario html
<html>
  <body>
<form method="POST" action="/Controller.php/__a/sms.send.remote.ol.sa">
      <input type="hidden" name="cte" value="12345" />
      <input type="hidden" name="encpwd" value="4c867bsdrb3b66ef802514f78fff6320a4ea8f" />
      <input type="hidden" name="email" value="usuario@auronix.com" />
      <input type="hidden" name="msg" value="Mensaje a través de petición HTTP" />
      <input type="hidden" name="numtel" value="5500000000" />
      <input type="hidden" name="mtipo" value="SMS" />
      <input type="hidden" name="idivr" value="125" />
      <input type="hidden" name="auxiliar" value="cta2345" />
      <input type="submit" value="Enviar" />
    </form>
  </body>
</html>
*/
    vRequest      Utl_Http.req;
    vPostText     VARCHAR2(5000);
    vResponse     Utl_Http.resp;
    vResponseText VARCHAR2(2000);
    vErrorText    VARCHAR2(2000);

BEGIN
    ------------------------------------------------------------
    -- Construccion del POST
    ------------------------------------------------------------
    vPostText :=
   'cte='      ||Utl_Url.escape(cte,        TRUE )||CHR(38)||

'encpwd=222a2d1l5oe8f5167a55528x45d83719d987b8b88515pc56927ba12cc3eb8931&' ||
 'email=micorreo@miservidor.com&'||
 'numtel='    ||Utl_Url.escape(numtel,    TRUE )||CHR(38)||
 'mtipo='     ||Utl_Url.escape(mtipo,     TRUE )||CHR(38)||
 'msg='       ||Utl_Url.escape(msg,       TRUE )||CHR(38)||
 'idivr='     ||Utl_Url.escape(idivr,     TRUE )||CHR(38)||
 'auxiliar='  ||Utl_Url.escape(auxiliar,  TRUE );


    ------------------------------------------------------------
    -- Si necesitas algun proxy, descomenta la linea.
    ------------------------------------------------------------
/*Utl_Http.set_proxy('proxy.it.micompania.com','micompania.com'); */
    ------------------------------------------------------------
    -- Envio de SMS a traves de targetphone SMS service.
    ------------------------------------------------------------
    vRequest := Utl_Http.begin_request
(url=> 'http://targetphone.com.mx/Controller.php/__a/sms.send.remote.ol.sa'
, method => 'POST'
                  );
    Utl_Http.set_header
      ( r     => vRequest
      , name  => 'Content-Type'
      , value => 'application/x-www-form-urlencoded'
      );
    Utl_Http.set_header
      ( r     => vRequest
      , name  => 'Content-Length'
      , value => LENGTH(vPostText)
      );
    Utl_Http.write_text
      ( r    => vRequest
      , data => vPostText
      );
    vResponse := Utl_Http.get_response(vRequest);
    IF vResponse.status_code = '200'
    THEN
        Utl_Http.read_text(vResponse, vResponseText);
        IF vResponseText NOT LIKE 'OK%'
        THEN
            vErrorText := vResponseText;
        END IF;
    ELSE
        vErrorText := 'HTTP status: '||vResponse.status_code||'-'||vResponse.reason_phrase;
    END IF;
    Utl_Http.end_response(vResponse);
    IF vErrorText IS NOT NULL
    THEN
        RAISE_APPLICATION_ERROR(-20001, 'Envio de SMS fallido con '||vResponseText);
 END IF;
END enviaSMS;
/

Forma de invocar:
BEGIN
SCHEMA.enviaSMS('2721390553','Esta es una prueba');
end;
/


Dudas comentarios Aquí: