Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

¿Que hacer con DBLink inactivo?

Estas en el tema de ¿Que hacer con DBLink inactivo? en el foro de Oracle en Foros del Web. Hola, tengo un problema con un procedimiento que estoy haciendo. Básicamente se trata de un trigger AFTER INSERT sobre una tabla, que introduce los datos ...
  #1 (permalink)  
Antiguo 27/05/2009, 09:53
 
Fecha de Ingreso: marzo-2005
Mensajes: 189
Antigüedad: 19 años, 8 meses
Puntos: 0
¿Que hacer con DBLink inactivo?

Hola, tengo un problema con un procedimiento que estoy haciendo.

Básicamente se trata de un trigger AFTER INSERT sobre una tabla, que introduce los datos en otra tabla de otra base de datos a traves de un DBLINK. Básicamente, las lineas de código problemáticas tienen esta estructura:

EL trigger llama a un procedimiento que tras unas comprobaciones ejecuta la siguiente sentencia:

IF <condicion> THEN
INSERT INTO tabla@db_link (campo1,campo2...) VALUES (valor1,valor2...);
END IF;


Claro, el problema es que si la base de datos a la que apunta el DBlink esta caida, la base de datos "origen" peta y no deja introducir mas valores en esa tabla, por lo tanto la aplicación que la usa también peta...

¿alguien sabe como puedo programar el procedimiento para que primero compruebe si el dblink está activo y entonces haga el insert?

O también habia pensado en usar algún tipo de error de excepción, similar al RESUME NEXT de VB, aunque supongo que en PL/SQL será de otra forma....

¿alguna idea?

Gracias y un saludo
  #2 (permalink)  
Antiguo 28/05/2009, 01:47
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 5 meses
Puntos: 43
Respuesta: ¿Que hacer con DBLink inactivo?

Antes del if haz un pequeño bloque pl-sql y le pones esto :

SELECT COUNT(*) INTO VARIABLE FROM DUAL@DB_LINK

Y gestionas la excepcion
  #3 (permalink)  
Antiguo 28/05/2009, 02:45
 
Fecha de Ingreso: enero-2008
Mensajes: 268
Antigüedad: 16 años, 10 meses
Puntos: 11
Respuesta: ¿Que hacer con DBLink inactivo?

Nota de optimización de SELECT:

Cita:
SELECT COUNT(1) INTO VARIABLE FROM DUAL@DB_LINK
COUNT(*): ha de leer todos los campos del registro
COUNT(1): comprueba que existe registro y sigue.
  #4 (permalink)  
Antiguo 28/05/2009, 03:21
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 5 meses
Puntos: 43
Respuesta: ¿Que hacer con DBLink inactivo?

En este caso no hay nada que optimizar, dual solo tiene un campo y un registro, pero buena aclaración.
  #5 (permalink)  
Antiguo 28/05/2009, 03:38
 
Fecha de Ingreso: enero-2008
Mensajes: 268
Antigüedad: 16 años, 10 meses
Puntos: 11
Respuesta: ¿Que hacer con DBLink inactivo?

Me referia optimizacion en general, por supuesto
  #6 (permalink)  
Antiguo 29/05/2009, 06:27
 
Fecha de Ingreso: marzo-2005
Mensajes: 189
Antigüedad: 19 años, 8 meses
Puntos: 0
Respuesta: ¿Que hacer con DBLink inactivo?

Hola, siguiendo vuestros consejos he usado:

BEGIN
SELECT COUNT(*) INTO testlink FROM DUAL@dblink;

INSERT INTO tabla@dblink (campo1,campo2) VALUES (valor1, valor2);

EXCEPTION
WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE ('caca');
END;


Pero no sirve de nada, cuando fuerzo a que se ejecute el trigger desde la aplicación esta hace un rollback y de devuelve el error ORA-02068.

¿habrá alguna forma de poder hacerlo totalmente transparenente para la aplicación?
  #7 (permalink)  
Antiguo 29/05/2009, 06:46
 
Fecha de Ingreso: enero-2008
Mensajes: 268
Antigüedad: 16 años, 10 meses
Puntos: 11
Respuesta: ¿Que hacer con DBLink inactivo?

Mmmmmmmm....

Dos cositas (una de ellas no se me había ocurrdio el otr dia)

1.- Estás usando un select count, por lo tanto tendrás qeu trabajar con la variable qeu te devuelve esto. Si elTEXTLINK es cero quiere decir que no ha podido conectarse. La variable te devolverá 1 si la conexion ha sido positiva
Por lo tanto el codigo es el siguiente.

Cita:
BEGIN
SELECT COUNT(1) INTO testlink FROM DUAL@dblink;

if textlink>0 then
INSERT INTO tabla@dblink (campo1,campo2) VALUES (valor1, valor2);
end if;

EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE ('caca');
-- este error NUNCA te va a saltar cuando uses un COUNT, ya que si no encuentra nada, el count te devuelve 0, y no nulo. Por lo tanto esta excepcion no hace falta
END;
- La otra opcion es controlar el error que te devuelve la aplicacion al no poder conectarse con el dblink. Es decir:


Cita:
BEGIN

INSERT INTO tabla@dblink (campo1,campo2) VALUES (valor1, valor2);

EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE ('Erro con el dblink');
-- Nota. Lo suyo es que en vez de controlar la excepcion con el OTHERS (que lo que hace es controlarte cualquier excepcion, controles exactamente la que se te está produciendo
END;

Usando cualquiera de estas dos formas, solucionarás tu problema.
Ya nos cuentas.

saludos
  #8 (permalink)  
Antiguo 29/05/2009, 06:47
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 5 meses
Puntos: 43
Respuesta: ¿Que hacer con DBLink inactivo?

Normal.
¿ que sentido tiene gestionar un NO_DATA_FOUND ?. Si no hay conexión con la remota , no te va a hacer el count.

Cambialo por un WHEN_OTHERS
  #9 (permalink)  
Antiguo 29/05/2009, 06:52
 
Fecha de Ingreso: enero-2008
Mensajes: 268
Antigüedad: 16 años, 10 meses
Puntos: 11
Respuesta: ¿Que hacer con DBLink inactivo?

JC hemos chocado en nuestras respuestas, jejejej

Como te dice JC, esa es otra solucion (que al fin y al cabo es igual que usar la segunda forma qeu yo te decia)
Aunque insisto, lo 'malo' de usar OTHERS es que te controla TODAS las excepciones (para bien y para mal)

Un saludo JC, jejej, por cierto, estás hecho una máquina!!!!!!

buen dia a ambos
  #10 (permalink)  
Antiguo 30/05/2009, 18:33
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 5 meses
Puntos: 43
Respuesta: ¿Que hacer con DBLink inactivo?

Si, es una lucha que tengo con mis programadores. Se hartan de poner when others y yo me harto de decirles que NO hagan eso, pero.........................
  #11 (permalink)  
Antiguo 01/06/2009, 00:31
 
Fecha de Ingreso: marzo-2005
Mensajes: 189
Antigüedad: 19 años, 8 meses
Puntos: 0
Respuesta: ¿Que hacer con DBLink inactivo?

Perfecto, gracias a los dos.

Finalmente me he decantado por la segunda opción de Javi_cassi, Ya que no se me ocurren demasiadas excepciones que puedan ocurrir aparte del fallo de conexión del dblink, por lo que yo creo que me vale. Lo he probado y ya no me bloquea la aplicación.


Lo dicho, gracias y un saludo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:52.