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

Error en procedimiento almacenado

Estas en el tema de Error en procedimiento almacenado en el foro de Mysql en Foros del Web. Hola, tengo el siguiente procedimiento almacenado: Código: DELIMITER // CREATE PROCEDURE inserciones (ruta varchar(30),tempo varchar(8), espacio decimal(5,2)) BEGIN declare space decimal (7,2); declare hora int(8); ...
  #1 (permalink)  
Antiguo 20/12/2012, 12:29
 
Fecha de Ingreso: enero-2012
Mensajes: 52
Antigüedad: 12 años, 3 meses
Puntos: 1
Pregunta Error en procedimiento almacenado

Hola, tengo el siguiente procedimiento almacenado:
Código:
DELIMITER //

CREATE PROCEDURE inserciones (ruta varchar(30),tempo varchar(8),
espacio decimal(5,2))
BEGIN
declare space decimal (7,2);
declare hora int(8);
declare minuto int(8);
declare segundo int(8);
declare resultado decimal(7,2);
declare kilocal decimal(5.2);
declare operacion decimal(7.2);

set space = espacio*1000;
set hora = cast(substring(tempo,1,2)as unsigned);
set minuto = cast(substring(tempo,4,2)as unsigned);
set segundo = cast(substring(tempo,-2)as unsigned);

set hora = hora*3600;
set minuto = minuto*60;
set resultado = (space/(hora+minuto+segundo))*3.6;

select coeficiente from coeficientes where resultado
between coeficientes.desde and coeficientes.hasta into operacion;
set kilocal = (85*operacion*((hora*60)+minuto+(segundo/60)));

insert into datos (recorrido,tiempo,distancia,calorias,kmh)
values (ruta,tempo,espacio,kilocal,resultado);


END //
Las tablas de mi bd son:
Código:
CREATE TABLE IF NOT EXISTS `datos` (
  `salida_num` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `recorrido` varchar(30) COLLATE utf8_spanish2_ci NOT NULL,
  `tiempo` varchar(8) COLLATE utf8_spanish2_ci NOT NULL,
  `distancia` decimal(5,2) NOT NULL,
  `calorias` decimal(5,2) NOT NULL,
  `kmh` decimal(5,2) NOT NULL,
  PRIMARY KEY (`salida_num`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci AUTO_INCREMENT=1 ;
Y
Código:
CREATE TABLE IF NOT EXISTS `coeficientes` (
  `kmh` decimal(3,1) unsigned NOT NULL,
  `desde` decimal(4,2) unsigned NOT NULL,
  `hasta` decimal(4,2) unsigned NOT NULL,
  `coeficiente` decimal(5,4) unsigned NOT NULL,
  PRIMARY KEY (`kmh`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci;
Mi problema es que al realizar el procedimiento anterior, en la tabla datos no me inserta nada en el campo calorias, no sé porqué. ¿Podéis ayudarme?. Gracias.
  #2 (permalink)  
Antiguo 21/12/2012, 04:47
Avatar de satjaen  
Fecha de Ingreso: septiembre-2012
Ubicación: Jaén (Andalucía)
Mensajes: 893
Antigüedad: 11 años, 7 meses
Puntos: 10
Respuesta: Error en procedimiento almacenado

Cita:
Iniciado por solilopi Ver Mensaje
Hola, tengo el siguiente procedimiento almacenado:
Código:
DELIMITER //

CREATE PROCEDURE inserciones (ruta varchar(30),tempo varchar(8),
espacio decimal(5,2))
BEGIN
declare space decimal (7,2);
declare hora int(8);
declare minuto int(8);
declare segundo int(8);
declare resultado decimal(7,2);
declare kilocal decimal(5.2);
declare operacion decimal(7.2);

set space = espacio*1000;
set hora = cast(substring(tempo,1,2)as unsigned);
set minuto = cast(substring(tempo,4,2)as unsigned);
set segundo = cast(substring(tempo,-2)as unsigned);

set hora = hora*3600;
set minuto = minuto*60;
set resultado = (space/(hora+minuto+segundo))*3.6;

select coeficiente from coeficientes where resultado
between coeficientes.desde and coeficientes.hasta into operacion;
set kilocal = (85*operacion*((hora*60)+minuto+(segundo/60)));

insert into datos (recorrido,tiempo,distancia,calorias,kmh)
values (ruta,tempo,espacio,kilocal,resultado);


END //
Las tablas de mi bd son:
Código:
CREATE TABLE IF NOT EXISTS `datos` (
  `salida_num` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `recorrido` varchar(30) COLLATE utf8_spanish2_ci NOT NULL,
  `tiempo` varchar(8) COLLATE utf8_spanish2_ci NOT NULL,
  `distancia` decimal(5,2) NOT NULL,
  `calorias` decimal(5,2) NOT NULL,
  `kmh` decimal(5,2) NOT NULL,
  PRIMARY KEY (`salida_num`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci AUTO_INCREMENT=1 ;
Y
Código:
CREATE TABLE IF NOT EXISTS `coeficientes` (
  `kmh` decimal(3,1) unsigned NOT NULL,
  `desde` decimal(4,2) unsigned NOT NULL,
  `hasta` decimal(4,2) unsigned NOT NULL,
  `coeficiente` decimal(5,4) unsigned NOT NULL,
  PRIMARY KEY (`kmh`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci;
Mi problema es que al realizar el procedimiento anterior, en la tabla datos no me inserta nada en el campo calorias, no sé porqué. ¿Podéis ayudarme?. Gracias.
Aquí no es tiempo?:

Código MySQL:
Ver original
  1. values (ruta,tempo,espacio,kilocal,resultado);

Un saludo
  #3 (permalink)  
Antiguo 21/12/2012, 05:11
 
Fecha de Ingreso: enero-2012
Mensajes: 52
Antigüedad: 12 años, 3 meses
Puntos: 1
Pregunta Respuesta: Error en procedimiento almacenado

Hola, si te fijas, lo que le paso al procedimiento es tempo y, como no lo altero, lo inserto en la Bd tal cual.
  #4 (permalink)  
Antiguo 24/12/2012, 05:01
 
Fecha de Ingreso: enero-2012
Mensajes: 52
Antigüedad: 12 años, 3 meses
Puntos: 1
Respuesta: Error en procedimiento almacenado

¡¡¡Solucionado!!!
  #5 (permalink)  
Antiguo 24/12/2012, 06:43
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: Error en procedimiento almacenado

Cita:
Iniciado por solilopi Ver Mensaje
¡¡¡Solucionado!!!
Si explicas la solución, le puede servir de ayuda a otros usuarios que se puedan encontrar con el mismo problema...
  #6 (permalink)  
Antiguo 25/12/2012, 05:54
 
Fecha de Ingreso: enero-2012
Mensajes: 52
Antigüedad: 12 años, 3 meses
Puntos: 1
De acuerdo Respuesta: Error en procedimiento almacenado

La solución es muy simple, aunque no la ví hasta el final.
Lo que tenía que hacer era convertir las variables de tiempo a minutos pués las tenía en segundos. el resultado es:
Código MySQL:
Ver original
  1. delimiter //
  2.  
  3. CREATE PROCEDURE inserciones (recorrido varchar(30) charset utf8 ,tempo varchar(8) charset utf8,
  4. espacio decimal(5,2) unsigned)
  5. declare hora int(8) default 0;
  6. declare minuto int(8)default 0;
  7. declare segundo int(8) default 0;
  8. declare resultado decimal(5,2) default 0;
  9. declare tiempo_en_minutos decimal(7,3)default 0;
  10. declare calorias decimal(6,2) default 0;
  11. declare operacion decimal(5,4) default 0;
  12.  
  13. set space = espacio*1000;
  14. set hora = cast(substring(tempo,1,2)as unsigned);
  15. set minuto = cast(substring(tempo,4,2)as unsigned);
  16. set segundo = cast(substring(tempo,-2)as unsigned);
  17.  
  18. set hora = hora*3600;
  19. set minuto = minuto*60;
  20. set resultado = (space/(hora+minuto+segundo))*3.6;
  21. set tiempo_en_minutos = (hora+minuto+segundo)/60;
  22.  
  23. select coeficiente from coeficientes where resultado
  24. between desde and hasta into operacion;
  25.  
  26. set calorias = ((85*2.2)*operacion)*tiempo_en_minutos;
  27.  
  28. insert into datos (recorrido,tiempo,distancia,calorias,kmh)
  29. values (recorrido,tempo,espacio,calorias,resultado);
  30.  
  31. END//

Última edición por gnzsoloyo; 25/12/2012 a las 07:59 Razón: Mal etiquetado. Corresponde usar Highlight "MySQL"
  #7 (permalink)  
Antiguo 25/12/2012, 08:04
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Error en procedimiento almacenado

A mi entender estás complicando innecesariamente el código, recargándolo de operaciones que se pueden obviar con funciones. Especialmente si la hora en el parámetro "tempo" es un TIME con formato "HH:MM:SS", tal como se infiere de lo que haces en el script.
Incluso, si lees el manual, verás que hay funciones específicas para extraer Año, Mes, Día, Horas, Minutos o segundos de una fecha, fecha y hora o de una hora expresada como tiempo. No necesitas hacer cosas complicadas.
Las funciones de MySQL para fechas y horas son muchas y si las aprovechas tendrás mejores resultados.
Creo que para simplificar la cosa andaría por acá:
Código MySQL:
Ver original
  1. DELIMITER $$
  2. CREATE PROCEDURE inserciones (
  3.     recorrido VARCHAR(30) CHARSET utf8,
  4.     tempo VARCHAR(8) CHARSET utf8,
  5.     espacio DECIMAL(5,2) UNSIGNED)
  6.     DECLARE resultado DECIMAL(5,2) DEFAULT 0;
  7.     DECLARE tiempo_en_minutos DECIMAL(7,3)DEFAULT 0;
  8.     DECLARE calorias DECIMAL(6,2) DEFAULT 0;
  9.    
  10.     SET space = espacio*1000;
  11.    
  12.     SET resultado = (space/(TIME_TO_SEC(tempo)))*3.6;
  13.     SET tiempo_en_minutos = TIME_TO_SEC(tempo)/60;
  14.    
  15.     SELECT (coeficiente * 85 * 2.2 * tiempo_en_minutos) -- La multiplicacion es una operacion distributiva, en este caso los parentesis son superfluos
  16.     FROM coeficientes
  17.     WHERE resultado BETWEEN desde AND hasta
  18.     INTO calorias;
  19.    
  20.     INSERT INTO datos(recorrido, tiempo, distancia, calorias, kmh)
  21.     VALUES(recorrido, tempo, espacio, calorias, resultado);
Un tip, respecto a DELIMITER: No es buena práctica usar para el cambio de delimitador caracteres que estén relacionados con operaciones de algún tipo. COmo por ejemplo las barras, porque pueden generar conflictos en algún momento.
Si te fijas con cuidado, todos los editores ( y los ejemplos del manual) usan el "$$". Por algo es.
Usa ese, no las dobles barras.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: procedimiento, select, tabla, almacenar, campos
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 05:10.