Procedimientos almacenados
Posted by: Manuel Gutierrez
Date: May 24, 2018 01:21AM
Date: May 24, 2018 01:21AM
Buenos días;
Tengo una pregunta curiosa, tengo un ubuntu server con Mysql Server 5.5.60 en el cual hay una serie de eventos que se ejecutan cada noche llamando a procedimientos almacenados.
He controlado el acceso a los eventos y procedimientos, en una tabla inserto donde entra y la hora, pues efectivamente los eventos se ejecutan y los procedimientos también pero no realizan su tarea. Entra en la condición específica pero no actualiza las tablas, lo curioso es que si haces la misma llamada que hace el evento de forma manual si se actualizan las tablas y pasa por las mismas condiciones que cuando se ejecuta de forma automática por las noches.
¿Alguien tiene idea de que puede estar pasando?
Os dejo el evento y el procedimiento.
EVENTO
------
BEGIN
CALL actualiza_viajes(DATE_SUB(DATE_FORMAT(NOW(), '%Y-%m-%d 00:00:00'), INTERVAL 1 DAY));
INSERT INTO event_messages(message,generated_at) Values('actualiza_viajes Preserve',NOW());
END
PROCEDURE 1
-----------
BEGIN
declare done int default 0;
declare operario_list varchar(8);
declare coperarios cursor for select operario from picadas_mes where ot like '%002%' and DATE_FORMAT(dia,'%d%m%Y')=DATE_FORMAT(picadas_mes.Fecha,'%d%m%Y');
declare continue handler for sqlstate '02000' set done=1;
insert into debug(debug) value('ENTRA VIAJEs');
open coperarios;
repeat
fetch coperarios into operario_list;
if not done then
CALL actualiza_viajes_operario(dia,operario_list);
end if;
UNTIL done end repeat;
close coperarios;
INSERT INTO event_messages(message,generated_at) Values('actualiza_viajes FINALIZADO',NOW());
END
PROCEDURE 2
-----------
BEGIN
DECLARE DONE INT DEFAULT 0;
DECLARE id_picada INT;
DECLARE ot_op VARCHAR(9);
DECLARE entrada TIME;
DECLARE salida TIME;
DECLARE ot_entrada VARCHAR(3);
DECLARE ot_salida VARCHAR(3);
DECLARE c1 CURSOR FOR select id,ot,DATE_FORMAT(h_entrada,'%H:%i:%s'),DATE_FORMAT(hora_salida,'%H:%i:%s'),SUBSTRING(ot,1,3),SUBSTRING(ot,6,3) from picadas_mes where operario=operario_picada and date_format(dia,'%d%m%Y')=date_format(picadas_mes.fecha,'%d%m%Y')
and ((ot like '%002%')) order by h_entrada ASC;
DECLARE continue handler for sqlstate '02000' set done=1;
select tipo_horario into @t_horario from operarios where operario=operario_picada;
select dayofweek(dia) as fecha_calculo from operarios group by fecha_calculo into @d_semana;
SELECT Direccion
INTO @n_operario
FROM operarios
WHERE operario = operario_picada;
select l_entrada_manana into @entrada_manana from horarios,operarios where operario=operario_picada and operarios.tipo_horario=horarios.tipo_horario and dia_semana=@d_semana;
select l_salida_manana into @salida_manana from horarios,operarios where operario=operario_picada and operarios.tipo_horario=horarios.tipo_horario and dia_semana=@d_semana;
select hora_entrada_manana_calculo_ot into @entrada_calculo_ot_manana from horarios,operarios where operario=operario_picada and operarios.tipo_horario=horarios.tipo_horario and dia_semana=@d_semana;
select hora_salida_manana_calculo_ot into @salida_calculo_ot_manana from horarios,operarios where operario=operario_picada and operarios.tipo_horario=horarios.tipo_horario and dia_semana=@d_semana;
OPEN c1;
REPEAT
fetch c1 into id_picada,ot_op,entrada,salida,ot_entrada,ot_salida;
if not done then
select observaciones from picadas_mes where id=id_picada into @observaciones_anteriores;
CASE
WHEN ((entrada >= @entrada_manana) and (ot_entrada='002') and (ot_salida <> '002') and NOT EXISTS(select * from picadas_mes where date_format(dia,'%d%m%Y')=date_format(picadas_mes.fecha,'%d%m%Y') and DATE_FORMAT(h_entrada,'%H:%i:%s')<entrada and DATE_FORMAT(h_entrada,'%H:%i:%s') < @salida_manana and operario=operario_picada)) THEN
UPDATE picadas_mes set observaciones=CONCAT(IFNULL(@observaciones_anteriores,''),' VIAJE COMIENZO JORNADA MANANA '),horas_compensadas=ADDTIME(horas_compensadas,TIMEDIFF(entrada,@entrada_calculo_ot_manana)),H_REALES=ADDTIME(hfh_compensadas,ADDTIME(h_computables,TIMEDIFF(entrada,@entrada_calculo_ot_manana))) where operario=operario_picada and observaciones not like '%VIAJE%' and id=id_picada;
INSERT INTO event_messages(message,generated_at) Values(concat("VIAJE INICIO JORNADA"," ",@n_operario),NOW());
WHEN ((salida <= @salida_manana) and (ot_entrada<> '002') and (ot_salida = '002') and NOT EXISTS(select * from picadas_mes where date_format(dia,'%d%m%Y')=date_format(picadas_mes.fecha,'%d%m%Y') and DATE_FORMAT(h_entrada,'%H:%i:%s')>entrada and (DATE_FORMAT(h_entrada,'%H:%i:%s') < @salida_manana and DATE_FORMAT(h_entrada,'%H:%i:%s')>entrada) and operario=operario_picada)) THEN
UPDATE picadas_mes set observaciones=CONCAT(IFNULL(@observaciones_anteriores,''),' VIAJE FINAL JORNADA MANANA '),horas_compensadas=ADDTIME(horas_compensadas,TIMEDIFF(@salida_calculo_ot_manana,salida)),H_REALES=ADDTIME(hfh_compensadas,ADDTIME(h_computables,TIMEDIFF(@salida_calculo_ot_manana,salida))) where operario=operario_picada and observaciones not like '%VIAJE%' and id=id_picada;
INSERT INTO event_messages(message,generated_at) Values(concat("VIAJE FINAL JORNADA"," ",@n_operario),NOW());
WHEN ((entrada >= @entrada_manana) and (salida <= @salida_manana) and ot_salida = '002' and EXISTS(select * from picadas_mes where date_format(dia,'%d%m%Y')=date_format(picadas_mes.fecha,'%d%m%Y') and DATE_FORMAT(h_entrada,'%H:%i:%s')>salida and DATE_FORMAT(h_entrada,'%H:%i:%s') < @salida_manana and ot like '%002E%' and operario=operario_picada) ) THEN
IF(EXISTS(select h_entrada from picadas_mes where date_format(dia,'%d%m%Y')=date_format(picadas_mes.fecha,'%d%m%Y') and DATE_FORMAT(h_entrada,'%H:%i:%s')>salida and DATE_FORMAT(h_entrada,'%H:%i:%s') < @salida_manana and ot like '%002E%' and operario=operario_picada))THEN
select h_entrada into @entrada_siguiente_manana from picadas_mes where date_format(dia,'%d%m%Y')=date_format(picadas_mes.fecha,'%d%m%Y') and DATE_FORMAT(h_entrada,'%H:%i:%s')>salida and DATE_FORMAT(h_entrada,'%H:%i:%s') < @salida_manana and ot like '%002E%' and operario=operario_picada;
UPDATE picadas_mes set observaciones=CONCAT(IFNULL(@observaciones_anteriores,''),' VIAJE MITAD JORNADA '),horas_compensadas=ADDTIME(horas_compensadas,TIMEDIFF(DATE_FORMAT(@entrada_siguiente_manana,'%H:%i:%s'),salida)),H_REALES=ADDTIME(hfh_compensadas,ADDTIME(h_computables,TIMEDIFF(DATE_FORMAT(@entrada_siguiente_manana,'%H:%i:%s'),salida))) where operario=operario_picada and (observaciones not like '%VIAJE MITAD JORNADA%') and id=id_picada;
INSERT INTO event_messages(message,generated_at) Values(concat("VIAJE MITAD JORNADA"," ",@n_operario),NOW());
END IF;
ELSE
BEGIN
IF(NOT EXISTS(select * from picadas_mes where date_format(dia,'%d%m%Y')=date_format(picadas_mes.fecha,'%d%m%Y') and DATE_FORMAT(hora_salida,'%H:%i:%s')<entrada and ot like '%002S%' and operario=operario_picada and observaciones like '%VIAJE%'))THEN
INSERT INTO incidencias(operario,fecha,ot,descripcion) values(operario_picada,DATE_FORMAT(CURDATE(),'%Y-%m-%d %H:%i:%s'),'002','REVISAR PICADA 002 (PROBLEMA CALCULOS)');
UPDATE picadas_mes set INCIDENCIA='1' where id=id_picada;
INSERT INTO event_messages(message,generated_at) Values(concat("VIAJE INCIDENCIA"," ",@n_operario),NOW());
END IF;
END;
END CASE;
END IF;
UNTIL done end repeat;
INSERT INTO event_messages(message,generated_at) Values('actualiza_viajess_operario FINALIZADO',NOW());
END
Tengo una pregunta curiosa, tengo un ubuntu server con Mysql Server 5.5.60 en el cual hay una serie de eventos que se ejecutan cada noche llamando a procedimientos almacenados.
He controlado el acceso a los eventos y procedimientos, en una tabla inserto donde entra y la hora, pues efectivamente los eventos se ejecutan y los procedimientos también pero no realizan su tarea. Entra en la condición específica pero no actualiza las tablas, lo curioso es que si haces la misma llamada que hace el evento de forma manual si se actualizan las tablas y pasa por las mismas condiciones que cuando se ejecuta de forma automática por las noches.
¿Alguien tiene idea de que puede estar pasando?
Os dejo el evento y el procedimiento.
EVENTO
------
BEGIN
CALL actualiza_viajes(DATE_SUB(DATE_FORMAT(NOW(), '%Y-%m-%d 00:00:00'), INTERVAL 1 DAY));
INSERT INTO event_messages(message,generated_at) Values('actualiza_viajes Preserve',NOW());
END
PROCEDURE 1
-----------
BEGIN
declare done int default 0;
declare operario_list varchar(8);
declare coperarios cursor for select operario from picadas_mes where ot like '%002%' and DATE_FORMAT(dia,'%d%m%Y')=DATE_FORMAT(picadas_mes.Fecha,'%d%m%Y');
declare continue handler for sqlstate '02000' set done=1;
insert into debug(debug) value('ENTRA VIAJEs');
open coperarios;
repeat
fetch coperarios into operario_list;
if not done then
CALL actualiza_viajes_operario(dia,operario_list);
end if;
UNTIL done end repeat;
close coperarios;
INSERT INTO event_messages(message,generated_at) Values('actualiza_viajes FINALIZADO',NOW());
END
PROCEDURE 2
-----------
BEGIN
DECLARE DONE INT DEFAULT 0;
DECLARE id_picada INT;
DECLARE ot_op VARCHAR(9);
DECLARE entrada TIME;
DECLARE salida TIME;
DECLARE ot_entrada VARCHAR(3);
DECLARE ot_salida VARCHAR(3);
DECLARE c1 CURSOR FOR select id,ot,DATE_FORMAT(h_entrada,'%H:%i:%s'),DATE_FORMAT(hora_salida,'%H:%i:%s'),SUBSTRING(ot,1,3),SUBSTRING(ot,6,3) from picadas_mes where operario=operario_picada and date_format(dia,'%d%m%Y')=date_format(picadas_mes.fecha,'%d%m%Y')
and ((ot like '%002%')) order by h_entrada ASC;
DECLARE continue handler for sqlstate '02000' set done=1;
select tipo_horario into @t_horario from operarios where operario=operario_picada;
select dayofweek(dia) as fecha_calculo from operarios group by fecha_calculo into @d_semana;
SELECT Direccion
INTO @n_operario
FROM operarios
WHERE operario = operario_picada;
select l_entrada_manana into @entrada_manana from horarios,operarios where operario=operario_picada and operarios.tipo_horario=horarios.tipo_horario and dia_semana=@d_semana;
select l_salida_manana into @salida_manana from horarios,operarios where operario=operario_picada and operarios.tipo_horario=horarios.tipo_horario and dia_semana=@d_semana;
select hora_entrada_manana_calculo_ot into @entrada_calculo_ot_manana from horarios,operarios where operario=operario_picada and operarios.tipo_horario=horarios.tipo_horario and dia_semana=@d_semana;
select hora_salida_manana_calculo_ot into @salida_calculo_ot_manana from horarios,operarios where operario=operario_picada and operarios.tipo_horario=horarios.tipo_horario and dia_semana=@d_semana;
OPEN c1;
REPEAT
fetch c1 into id_picada,ot_op,entrada,salida,ot_entrada,ot_salida;
if not done then
select observaciones from picadas_mes where id=id_picada into @observaciones_anteriores;
CASE
WHEN ((entrada >= @entrada_manana) and (ot_entrada='002') and (ot_salida <> '002') and NOT EXISTS(select * from picadas_mes where date_format(dia,'%d%m%Y')=date_format(picadas_mes.fecha,'%d%m%Y') and DATE_FORMAT(h_entrada,'%H:%i:%s')<entrada and DATE_FORMAT(h_entrada,'%H:%i:%s') < @salida_manana and operario=operario_picada)) THEN
UPDATE picadas_mes set observaciones=CONCAT(IFNULL(@observaciones_anteriores,''),' VIAJE COMIENZO JORNADA MANANA '),horas_compensadas=ADDTIME(horas_compensadas,TIMEDIFF(entrada,@entrada_calculo_ot_manana)),H_REALES=ADDTIME(hfh_compensadas,ADDTIME(h_computables,TIMEDIFF(entrada,@entrada_calculo_ot_manana))) where operario=operario_picada and observaciones not like '%VIAJE%' and id=id_picada;
INSERT INTO event_messages(message,generated_at) Values(concat("VIAJE INICIO JORNADA"," ",@n_operario),NOW());
WHEN ((salida <= @salida_manana) and (ot_entrada<> '002') and (ot_salida = '002') and NOT EXISTS(select * from picadas_mes where date_format(dia,'%d%m%Y')=date_format(picadas_mes.fecha,'%d%m%Y') and DATE_FORMAT(h_entrada,'%H:%i:%s')>entrada and (DATE_FORMAT(h_entrada,'%H:%i:%s') < @salida_manana and DATE_FORMAT(h_entrada,'%H:%i:%s')>entrada) and operario=operario_picada)) THEN
UPDATE picadas_mes set observaciones=CONCAT(IFNULL(@observaciones_anteriores,''),' VIAJE FINAL JORNADA MANANA '),horas_compensadas=ADDTIME(horas_compensadas,TIMEDIFF(@salida_calculo_ot_manana,salida)),H_REALES=ADDTIME(hfh_compensadas,ADDTIME(h_computables,TIMEDIFF(@salida_calculo_ot_manana,salida))) where operario=operario_picada and observaciones not like '%VIAJE%' and id=id_picada;
INSERT INTO event_messages(message,generated_at) Values(concat("VIAJE FINAL JORNADA"," ",@n_operario),NOW());
WHEN ((entrada >= @entrada_manana) and (salida <= @salida_manana) and ot_salida = '002' and EXISTS(select * from picadas_mes where date_format(dia,'%d%m%Y')=date_format(picadas_mes.fecha,'%d%m%Y') and DATE_FORMAT(h_entrada,'%H:%i:%s')>salida and DATE_FORMAT(h_entrada,'%H:%i:%s') < @salida_manana and ot like '%002E%' and operario=operario_picada) ) THEN
IF(EXISTS(select h_entrada from picadas_mes where date_format(dia,'%d%m%Y')=date_format(picadas_mes.fecha,'%d%m%Y') and DATE_FORMAT(h_entrada,'%H:%i:%s')>salida and DATE_FORMAT(h_entrada,'%H:%i:%s') < @salida_manana and ot like '%002E%' and operario=operario_picada))THEN
select h_entrada into @entrada_siguiente_manana from picadas_mes where date_format(dia,'%d%m%Y')=date_format(picadas_mes.fecha,'%d%m%Y') and DATE_FORMAT(h_entrada,'%H:%i:%s')>salida and DATE_FORMAT(h_entrada,'%H:%i:%s') < @salida_manana and ot like '%002E%' and operario=operario_picada;
UPDATE picadas_mes set observaciones=CONCAT(IFNULL(@observaciones_anteriores,''),' VIAJE MITAD JORNADA '),horas_compensadas=ADDTIME(horas_compensadas,TIMEDIFF(DATE_FORMAT(@entrada_siguiente_manana,'%H:%i:%s'),salida)),H_REALES=ADDTIME(hfh_compensadas,ADDTIME(h_computables,TIMEDIFF(DATE_FORMAT(@entrada_siguiente_manana,'%H:%i:%s'),salida))) where operario=operario_picada and (observaciones not like '%VIAJE MITAD JORNADA%') and id=id_picada;
INSERT INTO event_messages(message,generated_at) Values(concat("VIAJE MITAD JORNADA"," ",@n_operario),NOW());
END IF;
ELSE
BEGIN
IF(NOT EXISTS(select * from picadas_mes where date_format(dia,'%d%m%Y')=date_format(picadas_mes.fecha,'%d%m%Y') and DATE_FORMAT(hora_salida,'%H:%i:%s')<entrada and ot like '%002S%' and operario=operario_picada and observaciones like '%VIAJE%'))THEN
INSERT INTO incidencias(operario,fecha,ot,descripcion) values(operario_picada,DATE_FORMAT(CURDATE(),'%Y-%m-%d %H:%i:%s'),'002','REVISAR PICADA 002 (PROBLEMA CALCULOS)');
UPDATE picadas_mes set INCIDENCIA='1' where id=id_picada;
INSERT INTO event_messages(message,generated_at) Values(concat("VIAJE INCIDENCIA"," ",@n_operario),NOW());
END IF;
END;
END CASE;
END IF;
UNTIL done end repeat;
INSERT INTO event_messages(message,generated_at) Values('actualiza_viajess_operario FINALIZADO',NOW());
END
Subject
Views
Written By
Posted
Sorry, you can't reply to this topic. It has been closed.
Content reproduced on this site is the property of the respective copyright holders. It is not reviewed in advance by Oracle and does not necessarily represent the opinion of Oracle or any other party.