Insert entre bases de datos remotas enlazadas por dblink de Oracle

Insert entre bases de datos remotas enlazadas por dblink de Oracle cfb Tue, 08/19/2008 - 22:28

Para hacer un insert con Oracle SQL desde una tabla de una base de datos TablaBD1 a otra base de datos TablaBD2 a través de un dblink debería haber dos maneras:
 

1- Crear el database link en la base de datos origen BD1 y hacer el insert hacia la tabla de la base de datos destino BD2 a través de este dblink

SQL en la base de datos Oracle BD1:

CREATE [PUBLIC] DATABASE LINK BD1toBD2_dblink
CONNECT TO usuario2
IDENTIFIED BY password2
USING 'BD2';

INSERT INTO TablaBD2@BD1toBD2_dblink
(SELECT * FROM TablaBD1);

* Para simplificar suponemos que las tablas tienen la misma estructura
 

2- Crear el database link en la base de datos destino BD2 y hacer el insert seleccionando los registros de la tabla de la base de datos origen BD1 a través de este dblink:

SQL en la base de datos Oracle BD2:

CREATE [PUBLIC] DATABASE LINK BD2toBD1_dblink
CONNECT TO usuario1
IDENTIFIED BY password1
USING 'BD1';

INSERT INTO TablaBD2
(SELECT * FROM TablaBD1@BD2toBD1_dblink);

 

Yo hasta ahora he utilizado siempre el SQL de la segunda opción para enlazar bases de datos Oracle, supongo que porque parece más simple utilizar un dblink para seleccionar datos de una tabla de una base de datos remota que para insertarlos remotamente. Pues parece que lo mejor es buscar las cosas simples porque he podido comprobar que la primera opción no funciona, por lo menos a mi.

He probado a hacerlo creando con SQL un dblink entre dos bases de datos Oracle 10g y la inserción no se realizaba. Lo curioso es que la sentencia SQL, en lugar de devolverme un error me devolvía un mensaje de '0 registros insertados', cuando haciendo la SELECT sí que obtenía registros.

Yo he llegado a la conclusión de que la opción de insertar datos directamente en una tabla de una base de datos Oracle remota a través de un database link no funciona, hay que hacer una SELECT desde la base de datos 'destino'. Para simplificar, la @ ha de estar en la tabla de la sentencia SQL de SELECT, no en la de INSERT.

Si alguien tiene una explicación mejor le agradecería que lo comentara, porque el tema me parece bastante curioso.

 

Saludos Cordiales,
Tengo dos base de datos en Oracle 9i y necesito efectuar replicacion de datos entre ellos, ahora mismo uso DBLINK para mantener actualizada la información, pensamos cambiar a vistas materializadas, pero recientemente eschamos el STREAMS de Oracle, lo ha utilizado? podria sugerirme algunos link o información al respecto? el problema básico es que tengo una TABLA A en una DB 1 que constantemente se incrementa en el número de registros (Ocurren INSERT constantemente) y debemos actualizar la TABLA B en una BD 2. Cuando insertamos en la TABLA B cada vez que se inserte en la TABLA A se quedan conexiones abiertas que nunca se cierran y degrada el performance de la BD 1 y de la BD 2.
Puedes Ayudarnos?
Gracias de antemano

In reply to by Robely (not verified)

Las vistas materializadas pueden ser un buena opción para gestionar esta replicación, pero si las inserciones son muy frecuentes donde vas a notar mejora, con cualquier método que utilices para refrescar, es si en lugar de actualizar cada vez que insertas en la tabla origen, lo haces de manera agrupada, seleccionando los registros que han cambiado cada cierto tiempo para hacer un sólo insert cada x tiempo en lugar de un insert/update por registro creado o modificado.

Sobre STREAMS de Oracle yo no los he utilizado nunca, así que si los pruebas y nos explicas qué tal funcionan te lo agradezco.

Sobre vistas materializadas, te enlazo un artículo que explica cómo utilizar las vistas materializadas, e incluye enlaces a la documentación oficial de Oracle, espero que te ayude.

Y si te quedan dudas, en el foro tenemos abierto un tema sobre vistas materializadas de Oracle.

Saludos,

In reply to by Carlos

Hola, Muy buen aporte!

Sólo me queda una consulta... Haciendo el dblink éste permite que las modificaciones sean bidireccionales? 


Muchas gracias!

Saludos.-

In reply to by Manuel1222 (not verified)

Hola Manuel.

El DBLink es para utilizarlo desde la instancia de base de datos en la que se define, y desde esta poder enlazar con otras, pero de manera unidireccional, tanto para modificaciones como para consultas.

Es decir, que desde las bases de datos que se enlazan con el database link no se puede utilizar ni se ve este mismo dblink para conectar con la primera. Para hacerlo habria que definir un nuevo dblink en la otra base de datos.

Saludos!

 

Amigo necesito realizar un insert desde una bd SQL Server a Oracle, como hago para ejecutar o hacer un llamado a un Stored Procedure que realice un insert en la BD Oracle  desde una Bd SQL Server