MySQL - Duda procedimiento

 
Vista:
sin imagen de perfil
Val: 16
Ha aumentado su posición en 2 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

Duda procedimiento

Publicado por Mendizalea (17 intervenciones) el 07/05/2018 09:52:38
Buenos días,

Tengo el siguiente procedimiento el cual aun devolviendo que han sido afectadas 0 filas realiza correctamente el update:

1
2
3
4
5
6
7
DELIMITER $$
CREATE PROCEDURE `update_time_event`(IN `EventID` INT(8))
    NO SQL
BEGIN
UPDATE Tiempos SET Tiempo = IF((Salida IS NOT NULL OR Salida <> '') AND (Meta IS NOT NULL OR Meta <> ''), TIME_TO_SEC(TIMEDIFF(Meta,Salida))*1000 + MICROSECOND(TIMEDIFF(Meta, Salida))/1000, 0) WHERE IDCarrera = EventID;
END$$
DELIMITER ;

Es el primer procedimiento que creo, con lo que entiendo aun funcionando que algo esta mal.

Gracias
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: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Duda procedimiento

Publicado por leonardo_josue (414 intervenciones) el 07/05/2018 17:57:32
Hola Mendizalea:

Si al ejecutar la consulta te dice que no se actualizaron registros, entonces eso significa simplemente que no hay registros que cumplan con la condición que estás colocando en el UPDATE...

El SP como tal no tiene nada de malo, así es que el problema son los datos. Para comenzar no nos dices de qué tipo son tus campos, puedo suponer que los tienes definidos como TIME, pero eso sólo lo saben Dios y tú. Pero si los tienes definidos como TIME entonces no sé por qué en el IF los estás comparando como CADENAS al hacer esto:

1
2
3
...
(Salida IS NOT NULL OR Salida <> '') AND (Meta IS NOT NULL OR Meta <> '')
...

un campo TIME siempre será distinto de una cadena vacía... en todo caso podría ser que el campo esté definido como '00:00:00' que es el valor por defecto cuando se envía una cadena vacía, observa este ejemplo. voy a suponer que tu tabla TIEMPOS tiene la siguiente estructura:

1
2
3
4
5
6
7
mysql> CREATE TABLE tiempos (
    -> id_tiempo INT,
    -> IDCarrera INT,
    -> Salida    TIME,
    -> META      TIME,
    -> tiempo    DECIMAL(15,4));
Query OK, 0 rows affected (1.01 sec)

Entonces, observa cómo se comportan los datos al hacer INSERT's

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mysql> INSERT INTO tiempos (id_tiempo, IDCarrera, Salida, Meta) VALUES
    -> (1, 1, '10:10:10', '10:20:00'),
    -> (2, 1, '',         '10:24:04'), #aquí envío una cadena vacía como parámetro
    -> (3, 1, '10:10:10', NULL),       #aquí envío un nul como parámtero
    -> (4, 2, '10:15:10', '10:20:00'),
    -> (5, 2, '10:15:10', '10:21:14'),
    -> (6, 2, '10:15:10', '10:26:15');
Query OK, 6 rows affected (0.10 sec)
Records: 6  Duplicates: 0  Warnings: 0
 
mysql> SELECT * FROM tiempos;
+-----------+-----------+----------+----------+--------+
| id_tiempo | IDCarrera | Salida   | META     | tiempo |
+-----------+-----------+----------+----------+--------+
|         1 |         1 | 10:10:10 | 10:20:00 |   NULL |
|         2 |         1 | 00:00:00 | 10:24:04 |   NULL | --> observa que le asigna 00:00:00, no cadena vacía
|         3 |         1 | 10:10:10 | NULL     |   NULL | --> observa que le asigna NULL
|         4 |         2 | 10:15:10 | 10:20:00 |   NULL |
|         5 |         2 | 10:15:10 | 10:21:14 |   NULL |
|         6 |         2 | 10:15:10 | 10:26:15 |   NULL |
+-----------+-----------+----------+----------+--------+
6 rows in set (0.00 sec)

El SP no tienen ningún problema:

1
2
3
4
5
6
7
8
9
mysql> DELIMITER $$
mysql> CREATE PROCEDURE `update_time_event`(IN `EventID` INT(8))
    ->     NO SQL
    -> BEGIN
    -> UPDATE Tiempos SET Tiempo = IF((Salida IS NOT NULL OR Salida <> '') AND (Meta IS NOT NULL OR Meta <> ''), TIME_TO_SEC(TIMEDIFF(Meta,Salida))*1000 + MICROSECOND(TIMEDIFF(Meta, Salida))/1000, 0) WHERE IDCarrera = EventID;
    -> END$$
Query OK, 0 rows affected (0.00 sec)
 
mysql> DELIMITER ;

Y si lo ejecuto enviando un parámetro que exista en la tabla, entonces funciona correctamente:

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
mysql> CALL update_time_event(1);
Query OK, 3 rows affected (0.07 sec)
 
mysql> SELECT * FROM tiempos;
+-----------+-----------+----------+----------+---------------+
| id_tiempo | IDCarrera | Salida   | META     | tiempo        |
+-----------+-----------+----------+----------+---------------+
|         1 |         1 | 10:10:10 | 10:20:00 |   590000.0000 |
|         2 |         1 | 00:00:00 | 10:24:04 | 37444000.0000 |
|         3 |         1 | 10:10:10 | NULL     |        0.0000 |
|         4 |         2 | 10:15:10 | 10:20:00 |          NULL |
|         5 |         2 | 10:15:10 | 10:21:14 |          NULL |
|         6 |         2 | 10:15:10 | 10:26:15 |          NULL |
+-----------+-----------+----------+----------+---------------+
6 rows in set (0.00 sec)
 
mysql> CALL update_time_event(2);
Query OK, 3 rows affected (0.07 sec)
 
mysql> SELECT * FROM tiempos;
+-----------+-----------+----------+----------+---------------+
| id_tiempo | IDCarrera | Salida   | META     | tiempo        |
+-----------+-----------+----------+----------+---------------+
|         1 |         1 | 10:10:10 | 10:20:00 |   590000.0000 |
|         2 |         1 | 00:00:00 | 10:24:04 | 37444000.0000 |
|         3 |         1 | 10:10:10 | NULL     |        0.0000 |
|         4 |         2 | 10:15:10 | 10:20:00 |   290000.0000 |
|         5 |         2 | 10:15:10 | 10:21:14 |   364000.0000 |
|         6 |         2 | 10:15:10 | 10:26:15 |   665000.0000 |
+-----------+-----------+----------+----------+---------------+
6 rows in set (0.00 sec)

EN AMBOS CASOS ME ACTUALIZA 3 REGISTROS, Observa en el caso del id_tiempo = 2 QUE ESTÁ ENTRANDO EN LA CONDICIÓN Y POR LO TANTO CALCULA LA DIFERENCIA, porque como te dije nunca un campo TIME SIEMPRE SERÁ DISTINTO DE CADENA VACÍA.

si al ejecutar el SP envías un PARÁMETRO QUE NO EXISTA EN LA TABLA, entonces no se actualiza ningún registro:}

1
2
mysql> CALL update_time_event(3);
Query OK, 0 rows affected (0.00 sec)

Checa bien tus datos y nos comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 16
Ha aumentado su posición en 2 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

Duda procedimiento

Publicado por Mendizalea (17 intervenciones) el 08/05/2018 13:51:41
Muchas gracias por su respuesta. Los campos son tipo time(3). Antiguamente estaban como VARCHAR porque el MySQL antiguo no soportaba time(3). Le he quitado la comparacion tipo cadena en el If pero sigo con el mismo problema. Me dice que se han modificado 0 filas. He generado una tabla para salir de dudas tal cual lo hiciste tu:

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
-- Tiempo de generación: 08-05-2018 a las 13:38:46
-- Versión del servidor: 5.7.22-log
-- Versión de PHP: 5.4.45-0+deb7u13
 
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
 
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
 
-- Estructura de tabla para la tabla `tiempos`
--
 
CREATE TABLE IF NOT EXISTS `tiempos` (
  `id_tiempo` int(11) NOT NULL,
  `idcarrera` int(11) DEFAULT NULL,
  `salida` time DEFAULT NULL,
  `meta` time DEFAULT NULL,
  `tiempo` decimal(15,4) DEFAULT NULL,
  PRIMARY KEY (`id_tiempo`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 
--
-- Volcado de datos para la tabla `tiempos`
--
 
INSERT INTO `tiempos` (`id_tiempo`, `idcarrera`, `salida`, `meta`, `tiempo`) VALUES
(1, 1, '10:10:10', '10:20:00', NULL),
(2, 1, '00:00:00', '10:24:04', NULL),
(3, 1, '10:10:10', NULL, NULL),
(4, 2, '10:15:10', '10:20:00', NULL),
(5, 2, '10:15:10', '10:21:14', NULL),
(6, 2, '10:15:10', '10:26:15', NULL);
 
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

MySQL ha devuelto un conjunto de valores vacío (es decir: cero columnas). (La consulta tardó 0.0018 seg)

Pero en cambio si que realiza el update:
1
2
3
4
5
6
7
8
9
10
-- Volcado de datos para la tabla `tiempos`
--
 
INSERT INTO `tiempos` (`id_tiempo`, `idcarrera`, `salida`, `meta`, `tiempo`) VALUES
(1, 1, '10:10:10', '10:20:00', 590000.0000),
(2, 1, '00:00:00', '10:24:04', 37444000.0000),
(3, 1, '10:10:10', NULL, 0.0000),
(4, 2, '10:15:10', '10:20:00', NULL),
(5, 2, '10:15:10', '10:21:14', NULL),
(6, 2, '10:15:10', '10:26:15', NULL);

El procedimiento:
1
2
3
4
5
6
7
CREATE DEFINER=`hibbil`@`%` PROCEDURE `update_event`(IN `eventID` INT)
    MODIFIES SQL DATA
BEGIN
UPDATE tiempos
SET tiempo = IF((salida IS NOT NULL) AND (meta IS NOT NULL), (TIME_TO_SEC(TIMEDIFF(meta,salida))*1000) + (MICROSECOND(TIMEDIFF(meta,salida))/1000), 0)
WHERE IDCarrera = EventID;
END
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: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Duda procedimiento

Publicado por leonardo_josue (414 intervenciones) el 08/05/2018 17:12:09
Hola de nuevo Mendizalea:

Pues no veo nada "raro" en lo que tienes... puedes ejecutar DESDE CONSOLA el siguiente script y decirnos cuál es la salida que te aparece:

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
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
-- Estructura de tabla para la tabla `tiempos`
DROP TABLE IF EXISTS `tiempos`;
CREATE TABLE IF NOT EXISTS `tiempos` (
  `id_tiempo` INT(11) NOT NULL,
  `idcarrera` INT(11) DEFAULT NULL,
  `salida` TIME DEFAULT NULL,
  `meta` TIME DEFAULT NULL,
  `tiempo` DECIMAL(15,4) DEFAULT NULL,
  PRIMARY KEY (`id_tiempo`)
) ENGINE=INNODB DEFAULT CHARSET=latin1;
-- Volcado de datos para la tabla `tiempos`
INSERT INTO `tiempos` (`id_tiempo`, `idcarrera`, `salida`, `meta`, `tiempo`) VALUES
(1, 1, '10:10:10', '10:20:00', NULL),
(2, 1, '00:00:00', '10:24:04', NULL),
(3, 1, '10:10:10', NULL, NULL),
(4, 2, '10:15:10', '10:20:00', NULL),
(5, 2, '10:15:10', '10:21:14', NULL),
(6, 2, '10:15:10', '10:26:15', NULL);
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
DROP PROCEDURE IF EXISTS `update_event`;
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `update_event`(IN `eventID` INT)
    MODIFIES SQL DATA
BEGIN
UPDATE tiempos
SET tiempo = IF((salida IS NOT NULL) AND (meta IS NOT NULL), (TIME_TO_SEC(TIMEDIFF(meta,salida))*1000) + (MICROSECOND(TIMEDIFF(meta,salida))/1000), 0)
WHERE IDCarrera = EventID;
END$$
DELIMITER ;
SELECT * FROM tiempos;
CALL update_event(1);
SELECT * FROM tiempos;

la ejecución final debería ser similar a esta:

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
mysql> SELECT * FROM tiempos;
+-----------+-----------+----------+----------+--------+
| id_tiempo | idcarrera | salida   | meta     | tiempo |
+-----------+-----------+----------+----------+--------+
|         1 |         1 | 10:10:10 | 10:20:00 |   NULL |
|         2 |         1 | 00:00:00 | 10:24:04 |   NULL |
|         3 |         1 | 10:10:10 | NULL     |   NULL |
|         4 |         2 | 10:15:10 | 10:20:00 |   NULL |
|         5 |         2 | 10:15:10 | 10:21:14 |   NULL |
|         6 |         2 | 10:15:10 | 10:26:15 |   NULL |
+-----------+-----------+----------+----------+--------+
6 rows in set (0.00 sec)
 
mysql> CALL update_event(1);
Query OK, 3 rows affected (0.01 sec)
 
mysql> SELECT * FROM tiempos;
+-----------+-----------+----------+----------+---------------+
| id_tiempo | idcarrera | salida   | meta     | tiempo        |
+-----------+-----------+----------+----------+---------------+
|         1 |         1 | 10:10:10 | 10:20:00 |   590000.0000 |
|         2 |         1 | 00:00:00 | 10:24:04 | 37444000.0000 |
|         3 |         1 | 10:10:10 | NULL     |        0.0000 |
|         4 |         2 | 10:15:10 | 10:20:00 |          NULL |
|         5 |         2 | 10:15:10 | 10:21:14 |          NULL |
|         6 |         2 | 10:15:10 | 10:26:15 |          NULL |
+-----------+-----------+----------+----------+---------------+
6 rows in set (0.00 sec)

es decir, al ejecutar el evento CALL se actualizan 3 registros... OJO, aquí valdría la pena hacer una observación, que igual y es lo que te está pasando... En el ejemplo observa que ya se actualizaron los tres registros, por lo tanto el campo de TIEMPO ya tiene un valor... si se vuelve a ejecutar el mismo procedimiento UNA SEGUNDA VEZ, entonces el resultado arrojará cero registros actualizados:


1
2
mysql> CALL update_event(1);
Query OK, 0 rows affected (0.07 sec)

Esto no quiere decir que algo vaya mal en la consulta, sino que simplemente NO SE HICIERON CAMBIOS EN LA TABLA... Aunque la condición se cumple, EL VALOR QUE SE LE ASIGNÓ A LOS REGISTROS ES EL MISMO QUE SE LE QUIERE IMPUTAR, por lo tanto NO HAY CAMBIOS EFECTIVOS. Una forma de asegurarte de que no haya información sería nulear primeramente el campo tiempo antes de ejecutar el SP:

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
mysql> update tiempos set tiempo = NULL where idcarrera = 1;
Query OK, 3 rows affected (0.08 sec)
Rows matched: 3  Changed: 3  Warnings: 0
 
mysql> SELECT * FROM tiempos;
+-----------+-----------+----------+----------+--------+
| id_tiempo | idcarrera | salida   | meta     | tiempo |
+-----------+-----------+----------+----------+--------+
|         1 |         1 | 10:10:10 | 10:20:00 |   NULL |
|         2 |         1 | 00:00:00 | 10:24:04 |   NULL |
|         3 |         1 | 10:10:10 | NULL     |   NULL |
|         4 |         2 | 10:15:10 | 10:20:00 |   NULL |
|         5 |         2 | 10:15:10 | 10:21:14 |   NULL |
|         6 |         2 | 10:15:10 | 10:26:15 |   NULL |
+-----------+-----------+----------+----------+--------+
6 rows in set (0.00 sec)
 
mysql> CALL update_event(1);
Query OK, 3 rows affected (0.11 sec)
 
mysql> SELECT * FROM tiempos;
+-----------+-----------+----------+----------+---------------+
| id_tiempo | idcarrera | salida   | meta     | tiempo        |
+-----------+-----------+----------+----------+---------------+
|         1 |         1 | 10:10:10 | 10:20:00 |   590000.0000 |
|         2 |         1 | 00:00:00 | 10:24:04 | 37444000.0000 |
|         3 |         1 | 10:10:10 | NULL     |        0.0000 |
|         4 |         2 | 10:15:10 | 10:20:00 |          NULL |
|         5 |         2 | 10:15:10 | 10:21:14 |          NULL |
|         6 |         2 | 10:15:10 | 10:26:15 |          NULL |
+-----------+-----------+----------+----------+---------------+
6 rows in set (0.00 sec)

haz la prueba y nos comentas.

Saludos
Leo.
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