Oracle - Problema Trigger

 
Vista:
sin imagen de perfil

Problema Trigger

Publicado por Rafa (16 intervenciones) el 06/10/2015 10:56:05
Buenos días,

Tengo un problema con un trigger y la verdad es que ya no sé por donde buscar el problema por lo que os pido alguna sugerencia.

Os cuento.

Tengo un enlace entre una base de datos Oracle y otra MySQL. Cuando una tabla de la base de datos Oracle se actualiza y se cumple una condición relativa a esos nuevos datos, se dispara el trigger que a su vez llama a un procedimiento almacenado y esos nuevos datos se guardan además de en la tabla Oracle en una tabla de la base de datos MySQL.

El DBLink funciona perfectamente y si hago select o insert into desde SQLPlus hacia la tabla MySQL funciona todo bien. Tengo el problema cuando es a través del trigger ya que obtengo este error:

ORA-06512: en "triggerdblink", línea 91
ORA-04088: error durante la ejecución del disparador 'triggerdblink'

Según he mirado ambos errores están relacionados, es decir que como se produce el error ORA-06512 automáticamente salta el otro indicando que ha fallado el disparador.

Por más que he buscado ese error ORA-06512, no tengo claros los posibles motivos.

Además ocurre que cuando programé el trigger y el procedimiento lo dejé funcionando pero al día siguiente fui a chequear como iba y vi que me apareció el error.

No sé si tengo que hacer algo adicional tipo reiniciar el listener o similar pero la verdad es que no tengo ni idea del problema ya que como digo estaba funcionando.

¿Alguna idea?

Gracias,

Rafa
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 499
Oro
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

Problema Trigger

Publicado por Rafael (328 intervenciones) el 06/10/2015 12:21:42
Vale y que tiene el trigger en la linea 91???

Vaya que el error te dice que ocurre un error hasta ahi todo OK, el problema es diagnosticar por que el error reportado es generico, podria ir desde la falta de un punto y coma, permisos, etc.

Es dificil ayudarte sin conocer que es lo que pasa...

Podrias adjuntar el trigger???

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Problema Trigger

Publicado por Rafa (16 intervenciones) el 06/10/2015 13:46:43
Muy buenas,

Creía que el error no era tan genérico. Una cosa sí estaba mal en mi anterior post. El error me lo da en la línea 49.

Os paso el código del trigger:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
create or replace TRIGGER dblinktelemedidas after insert on telemedidas referencing old as old new as new for each row
DECLARE
var_pmedida_codint number;
var_tm number;
var_periodointeg number;
var_time date;
var_time_v varchar2(1);
var_valor1 number;
var_valor2 number;
var_valor3 number;
var_valor4 number;
var_valor5 number;
var_valor6 number;
var_valor7 number;
var_valor8 number;
var_cualificador1 number;
var_cualificador2 number;
var_cualificador3 number;
var_cualificador4 number;
var_cualificador5 number;
var_cualificador6 number;
var_cualificador7 number;
var_cualificador8 number;
 
BEGIN
 
if :new.pmedida_codint between 1135 and 1138 then
 
var_pmedida_codint:= :new.pmedida_codint;
var_tm:= :new.tm;
var_periodointeg:= :new.periodointeg;
var_time:= :new.time;
var_time_v:= :new.time_v;
var_valor1:= :new.valor1;
var_valor2:= :new.valor2;
var_valor3:= :new.valor3;
var_valor4:= :new.valor4;
var_valor5:= :new.valor5;
var_valor6:= :new.valor6;
var_valor7:= :new.valor7;
var_valor8:= :new.valor8;
var_cualificador1:= :new.cualificador1;
var_cualificador2:= :new.cualificador2;
var_cualificador3:= :new.cualificador3;
var_cualificador4:= :new.cualificador4;
var_cualificador5:= :new.cualificador5;
var_cualificador6:= :new.cualificador6;
var_cualificador7:= :new.cualificador7;
var_cualificador8:= :new.cualificador8;
pa_telemedidas(var_pmedida_codint, var_tm, var_periodointeg, var_time, var_time_v, var_valor1, var_valor2, var_valor3, var_valor4, var_valor5, var_valor6, var_valor7, var_valor8, var_cualificador1, var_cualificador2, var_cualificador3, var_cualificador4, var_cualificador5, var_cualificador6, var_cualificador7, var_cualificador8);
end if;
END;

Por su parte el procedimiento almacenado al que se llama desde el trigger es este:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
create or replace PROCEDURE pa_telemedidas (
	var_pmedida_codint in number,
	var_tm in number,
	var_periodointeg in number,
	var_time in date,
	var_time_v in varchar2,
	var_valor1 in number,
	var_valor2 in number,
	var_valor3 in number,
	var_valor4 in number,
	var_valor5 in number,
	var_valor6 in number,
	var_valor7 in number,
	var_valor8 in number,
	var_cualificador1 in number,
	var_cualificador2 in number,
	var_cualificador3 in number,
	var_cualificador4 in number,
	var_cualificador5 in number,
	var_cualificador6 in number,
	var_cualificador7 in number,
	var_cualificador8 in number
) as PRAGMA AUTONOMOUS_TRANSACTION;
begin
insert into cwtelemedidas@dblinkmysql ("pmedida_codint","tm","periodointeg","time_t","time_v","valor1","valor2","valor3","valor4","valor5","valor6", "valor7", "valor8", "cualificador1", "cualificador2","cualificador3","cualificador4","cualificador5","cualificador6","cualificador7","cualificador8") values (var_pmedida_codint, var_tm, var_periodointeg, var_time, var_time_v, var_valor1, var_valor2, var_valor3, var_valor4, var_valor5, var_valor6, var_valor7, var_valor8, var_cualificador1, var_cualificador2, var_cualificador3, var_cualificador4, var_cualificador5, var_cualificador6, var_cualificador7, var_cualificador8);
commit;
end;

Como veis cuando se insertan datos nuevos en la tabla telemedidas si estos datos se corresponden a unos equipos en concreto salta el trigger y los campos necesarios se insertan en la tabla cwtelemedidas que es la de MySQL.

El error me lo da en la línea 49 que es la inmediatamente anterior a la llamada al procedimiento aunque antes de hacer algún intento por arreglarlo el error era justo en la línea en la que se hacía la llamada al procedimiento.

Muchas gracias como siempre por la ayuda.

Saludos,

Rafa
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 499
Oro
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

Problema Trigger

Publicado por Rafael (328 intervenciones) el 06/10/2015 14:39:23
Por que no puebras compilando el trigger asi:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE OR REPLACE TRIGGER dblinktelemedidas
AFTER INSERT ON telemedidas
REFERENCING old AS old new AS new
FOR each row
BEGIN
	IF :new.pmedida_codint BETWEEN 1135 AND 1138 THEN
        pa_telemedidas(:new.pmedida_codint, :new.tm, :new.periodointeg, :new.TIME, :new.time_v,
                       :new.valor1, :new.valor2, :new.valor3, :new.valor4, :new.valor5, :new.valor6,
                       :new.valor7, :new.valor8, :new.cualificador1, :new.cualificador2, :new.cualificador3,
                       :new.cualificador4, :new.cualificador5, :new.cualificador6, :new.cualificador7,
                       :new.cualificador8);
    END IF;
END;
/

Antes de ejecutarlo revisa que el procedimiento pa_telemedidas se encuentra declaro para recibir los 20 parametros que se envian asi como que coincidan los tipos.

Saludos
Rafael
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Problema Trigger

Publicado por Rafa (16 intervenciones) el 06/10/2015 15:56:42
Hola Rafael,

Joder vaya ahorro de literatura con esa sintaxis. El trigger compila bien como antes pero vuelve a dar el mismo error y esta vez en la línea 3.

Como creo que no es imprescindible esa sentencia la he comentado pero entonces me vuelve a dar error en la línea 3 que sería en la que se declara FOR EACH ROW.

No sé por dónde tirar ya. Lo curioso es que alguna vez ha funcionado.

¿Alguna idea?

Saludos,

Rafa
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 499
Oro
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

Problema Trigger

Publicado por Rafael (328 intervenciones) el 07/10/2015 08:23:14
Cuando te dice la linea 3 es en la ejecucion del Procedure. 100% seguro.
Puedes poner que hace "pa_telemedidas"

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Problema Trigger

Publicado por Rafa (16 intervenciones) el 07/10/2015 09:31:32
Buenos días,

El código del procedimiento está también arriba y puedes verlo pero te resumo.

El procedimiento simplemente toma las variables que le pasa el trigger y a través del dblink inserta esos datos en la tabla cwtelemedidas de la base de datos MySQL.

He probado a hacer eso mismo desde sqlplus y los datos se insertan bien por lo que entiendo que el dblink está bien y que por tema de permisos de la tabla de MySQL tampoco hay problema. Los tipos de datos los he revisado y en principio están bien.

Saludos,

Rafa
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 499
Oro
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

Problema Trigger

Publicado por Rafael (328 intervenciones) el 07/10/2015 11:13:22
Primero DISCULPA no vi que ya esta

Despues te dire pues ahora lo tengo claro ......

A ver intenta compilar asi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
CREATE OR REPLACE PROCEDURE PA_TELEMEDIDAS (
	VAR_PMEDIDA_CODINT IN NUMBER,
	VAR_TM IN NUMBER,
	VAR_PERIODOINTEG IN NUMBER,
	VAR_TIME IN DATE,
	VAR_TIME_V IN VARCHAR2,
	VAR_VALOR1 IN NUMBER,
	VAR_VALOR2 IN NUMBER,
	VAR_VALOR3 IN NUMBER,
	VAR_VALOR4 IN NUMBER,
	VAR_VALOR5 IN NUMBER,
	VAR_VALOR6 IN NUMBER,
	VAR_VALOR7 IN NUMBER,
	VAR_VALOR8 IN NUMBER,
	VAR_CUALIFICADOR1 IN NUMBER,
	VAR_CUALIFICADOR2 IN NUMBER,
	VAR_CUALIFICADOR3 IN NUMBER,
	VAR_CUALIFICADOR4 IN NUMBER,
	VAR_CUALIFICADOR5 IN NUMBER,
	VAR_CUALIFICADOR6 IN NUMBER,
	VAR_CUALIFICADOR7 IN NUMBER,
	VAR_CUALIFICADOR8 IN NUMBER)
AS
BEGIN
    INSERT INTO CWTELEMEDIDAS@DBLINKMYSQL (PMEDIDA_CODINT,TM,PERIODOINTEG,TIME_T,TIME_V,
                VALOR1,VALOR2,VALOR3,VALOR4,VALOR5,VALOR6,VALOR7,VALOR8,
                CUALIFICADOR1,CUALIFICADOR2,CUALIFICADOR3,CUALIFICADOR4,
                CUALIFICADOR5,CUALIFICADOR6,CUALIFICADOR7,CUALIFICADOR8)
                VALUES (VAR_PMEDIDA_CODINT, VAR_TM, VAR_PERIODOINTEG, VAR_TIME, VAR_TIME_V,
                VAR_VALOR1, VAR_VALOR2, VAR_VALOR3, VAR_VALOR4,
                VAR_VALOR5, VAR_VALOR6, VAR_VALOR7, VAR_VALOR8,
                VAR_CUALIFICADOR1, VAR_CUALIFICADOR2, VAR_CUALIFICADOR3, VAR_CUALIFICADOR4,
                VAR_CUALIFICADOR5, VAR_CUALIFICADOR6, VAR_CUALIFICADOR7, VAR_CUALIFICADOR8);
END;
/
 
CREATE OR REPLACE TRIGGER dblinktelemedidas
AFTER INSERT ON telemedidas
REFERENCING old AS old new AS new
FOR each row
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
	IF :new.pmedida_codint BETWEEN 1135 AND 1138 THEN
        pa_telemedidas(:new.pmedida_codint, :new.tm, :new.periodointeg, :new.TIME, :new.time_v,
                       :new.valor1, :new.valor2, :new.valor3, :new.valor4,
                       :new.valor5, :new.valor6, :new.valor7, :new.valor8,
                       :new.cualificador1, :new.cualificador2, :new.cualificador3, :new.cualificador4,
                       :new.cualificador5, :new.cualificador6, :new.cualificador7, :new.cualificador8);
        COMMIT;
    END IF;
 
    ON ERROR
 
EXCEPTION
   WHEN OTHERS THEN  -- handles all other errors
      ROLLBACK;
END;
/

El problema esta creo en la atomizacion de la transacción.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Problema Trigger

Publicado por Rafa (16 intervenciones) el 07/10/2015 12:22:00
Hola crack,

El procedimiento no compilaba porque los campos del insert hay que entrecomillarlos y además deben ir en minúsculas. Tras probar y hacer esos cambios ha compilado. Lo de las comillas ya lo había observado probando el dblink.

El trigger me da error de compilación en la línea del ON ERROR porque indica que esperaba otro carácter. ¿Es necesario el ON ERROR?

Ya me cuentas y pruebo que estoy deseando que funcione.

Gracias,

Rafa
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 499
Oro
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

Problema Trigger

Publicado por Rafael (328 intervenciones) el 07/10/2015 12:28:29
El ON ERRO deberia ir comentado disculpa... lo puedes quitar...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Problema Trigger

Publicado por Rafael (16 intervenciones) el 07/10/2015 12:48:11
Hola de nuevo,

Mi gozo en un pozo.

He corregido otra cosa del procedimiento y es que antes del BEGIN ponía AS en lugar de IS.

Me han compilado tanto procedimiento como trigger pero no funciona. Ahora el error es más tocho si cabe. Adjunto pantallazo del error.

Muchas gracias por los intentos. Creía que sería más rápido de solucionar.

Como complemente de información decir que la tabla sobre la que se define el trigger la actualiza un programa. Imagino que al pulsar el botón de guardar el código de ese programa ejecutará tanto el insert into correspondiente como el commit. Lo digo por si esto te aclara algo en lo que a la transacción se refiere.

Mil gracias,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 499
Oro
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

Problema Trigger

Publicado por Rafael (328 intervenciones) el 07/10/2015 13:38:31
Vale el error es claro NO hay conexion con MySQL
Prueba el Procedimiento de forma unitaria no por el triger...

Yo estoy en madrid mandame un correo y si quieres lo resolvemos por SKYPE o similar ...

Ahora ya te digo si el programa lleva el commit quita en ambos
PRAGMA AUTONOMOUS_TRANSACTION;

Y toda referencia a commit y rollback
Pero ahora el problema es que no va el DBLINK.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Problema Trigger

Publicado por Rafael (16 intervenciones) el 07/10/2015 13:45:04
Hola de nuevo,

Al ver que no funcionaba vía trigger he probado el dblink desde MySQL y sí que funciona. He probado con un select pero bueno ayer probé con un insert into y también me funcionó.

Si te parece te paso un privado y lo vemos tranquilamente esta tarde o mañana. Te puedo dar acceso por TeamViewer también por si quieres echarle un vistazo.

Aún así probaré lo que me dices respecto a commit y rollback.

Lo más curiosos de todo es que la primera versión que envié por aquí ha funcionado alguna vez así que no sé muy bien qué ha podido pasar.

Pruebo y te digo.

Saludos,

Rafa
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Problema Trigger

Publicado por Rafa (16 intervenciones) el 07/10/2015 18:02:16
Hola de nuevo,

Para que quede por aquí y otra gente pueda beneficiarse te comento lo que he conseguido.

Efectivamente el DBLink vete tu a saber por qué había dejado de funcionar así que he reiniciado el listener y he vuelto a probar el código que ya tenía sin quitar commit, ni rollback ni autonomous transaction.

Al probar a guardar datos desde el programa ha funcionado pero solo se han guardado en la tabla oracle y no en la mysql. He comentado el commit del trigger y he añadido commit en el procedimiento almacenado tras el insert into y entonces SI HA FUNCIONADO.

Espero que no vuelva a fallar otra vez porque en su día funcionó y luego dejó de hacerlo. No sé si el reinicio del listener ha tenido algo que ver y si te cuadra lo que te he comentado de los commit pero bueno voy a ver estos días y te cuento.

Luego por privado te escribo y te comento otra cosa.

Gracias,

Rafa
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 499
Oro
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

Problema Trigger

Publicado por Rafael (328 intervenciones) el 08/10/2015 09:36:41
Que bueno que te ha funcionado ... MIS +1????
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar