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

Problema con Procedimiento Almacenado

Estas en el tema de Problema con Procedimiento Almacenado en el foro de Mysql en Foros del Web. Hola Esta es la primera vez que me atrevo a hacer una pregunta, pero he investigado mucho sobre los problemas que tengo pero no logro ...
  #1 (permalink)  
Antiguo 16/04/2012, 14:00
 
Fecha de Ingreso: abril-2012
Mensajes: 6
Antigüedad: 12 años, 1 mes
Puntos: 0
Pregunta Problema con Procedimiento Almacenado

Hola Esta es la primera vez que me atrevo a hacer una pregunta, pero he investigado mucho sobre los problemas que tengo pero no logro solucionarlo así que espero alguno de ustedes me puedan ayudar...

Bueno entrando en materia tengo un procedimiento almacenado que recibe 5 parámetros de entrada.

Código SQL:
Ver original
  1. USE fgaintegrado;
  2. DROP PROCEDURE IF EXISTS TotalSiniestralidad;
  3. DELIMITER //
  4.     CREATE PROCEDURE TotalSiniestralidad(IN nit_inter VARCHAR (25), IN convenio INT(4), IN movilizado INT(255), IN ingreso INT(255), IN porc_siniestralidad  DOUBLE)
  5.     BEGIN
  6.         DECLARE b_siniestralidad VARCHAR(1);
  7.         DECLARE total_siniestralidad INT(255);
  8.  
  9.         SELECT base_siniestralidad
  10.         INTO b_siniestralidad
  11.         FROM convenios
  12.         WHERE codigo_convenio = convenio COLLATE latin1_spanish_ci
  13.                 AND nit_intermediario = nit_inter COLLATE latin1_spanish_ci;
  14.  
  15.         IF(b_siniestralidad = 'M')
  16.             SET @total_siniestralidad = (movilizado * porc_siniestralidad);
  17.         ELSE
  18.             SET @total_siniestralidad = (ingreso * porc_siniestralidad);
  19.         END IF;
  20.  
  21.         SELECT @total_siniestralidad;
  22.     END;
  23.  //DELIMITER

El primer Problema que tengo es que no me corre por que aparece que tengo un error ([Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near) en la linea 13 y la verdad yo no encuentro el error...

Bueno el siguiente error que encontré un poco mas especifico, me di cuenta al probar cada una de las entradas que el procedimiento me esta cambiando el valor del parámetro de entrada movilizado en algunos casos por el numero 2147483647.

Procedimiento de prueba:
Código SQL:
Ver original
  1. USE fgaintegrado;
  2. DROP PROCEDURE IF EXISTS TotalSiniestralidad;
  3. DELIMITER //
  4.     CREATE PROCEDURE TotalSiniestralidad(IN nit_inter VARCHAR (25), IN convenio INT(4), IN movilizado INT(255), IN ingreso INT(255), IN porc_siniestralidad  DOUBLE )
  5.     BEGIN
  6.  
  7.         SELECT movilizado;
  8.    
  9.     END;
  10.  //DELIMITER

y el llamado de prueba es este:

Código SQL:
Ver original
  1. CALL TotalSiniestralidad('890300279', 1, 12373239017, 375660201, '1.5');

Y el result set es: 2147483647


No se por que estará pasando esto....

Agradezco de ante mano su colaboración
  #2 (permalink)  
Antiguo 16/04/2012, 14:14
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Problema con Procedimiento Almacenado

Hola tatipoveda25:

Mucho ojo, estás confundiendo la Longitud de un entero con los rangos de valores que puede almacenar... checa esta liga:

http://dev.mysql.com/doc/refman/5.0/...ric-types.html

ahí encontrarás lo siguiente:

Cita:
MySQL soporta otra extensión para especificar de forma óptima el ancho a mostrar de un tipo entero en paréntesis después de la palabra clave para el tipo (por ejemplo, INT(4)). Esta especificación opcional del ancho de muestra se usa para alinear a la izquierda la muestra de los valores con ancho menor que el ancho especificado para la columna.

El ancho de muestra no restringe el rango de valores que pueden almacenarse en la columna, no el número de dígitos que se muestran para valores con ancho que exceda el especificado para la columna.

Cuando se usa en conjunción con el atributo de extensión opcional ZEROFILL, el relleno por defecto de espacios se replaza por ceros. Por ejmplo, para una columna declarada como INT(5) ZEROFILL, un valor de 4 se muestra como 00004. Tenga en cuenta que si almacena valores mayores que el ancho de muestra en una columna entera, puede tener problemas cuando MySQL genera tablas temporales para algunos joins complicados, ya que en estos casos MySQL cree que los datos encajan en el ancho original de la columna.
Si vas a manejar números enteros grandes NO PONES INT(255), sino que utilizas el tipo de datos BIGINT (en la misma liga encuentras los rangos que soportan cada tipo de datos enteros). Si el rango no es suficiente ENTONCES DEBERÁS UTILIZAR CAMPOS CON PUNTO FLOTANTE.

saludos
Leo.
  #3 (permalink)  
Antiguo 16/04/2012, 14:18
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: Problema con Procedimiento Almacenado

Hay varias razones:
1) Mal uso de los DELIMITER.
2) Error de sintaxis en el IF ... THEN... ELSE ... END IF;
3) Incorrecto uso de las variables locales (el "@" se usa para las de sesión usuario, no para las locales).
4) Incorrecta definición de tipos de datos (No existe el INT(255), ese numero es imposible en ese contexto).

Probemos:
Código MySQL:
Ver original
  1. USE fgaintegrado;
  2. DROP PROCEDURE IF EXISTS TotalSiniestralidad;
  3. DELIMITER $$
  4.     CREATE PROCEDURE TotalSiniestralidad(IN nit_inter VARCHAR (25), IN convenio INT, IN movilizado INT, IN ingreso INT, IN porc_siniestralidad  DOUBLE)
  5.     BEGIN
  6.         DECLARE b_siniestralidad VARCHAR(1);
  7.         DECLARE total_siniestralidad INT;
  8.  
  9.         SELECT base_siniestralidad
  10.         INTO b_siniestralidad
  11.         FROM convenios
  12.         WHERE codigo_convenio = convenio COLLATE latin1_spanish_ci
  13.                 AND nit_intermediario = nit_inter COLLATE latin1_spanish_ci;
  14.         IF(b_siniestralidad = 'M') THEN
  15.             SET total_siniestralidad = (movilizado * porc_siniestralidad);
  16.         ELSE
  17.             SET total_siniestralidad = (ingreso * porc_siniestralidad);
  18.         END IF;
  19.          SELECT total_siniestralidad;
  20.     END$$
  21. DELIMITER ;

Saludos para Leonardo, que hoy se me adelantó...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 16/04/2012, 15:16
 
Fecha de Ingreso: abril-2012
Mensajes: 6
Antigüedad: 12 años, 1 mes
Puntos: 0
Respuesta: Problema con Procedimiento Almacenado

Los dos Fueron de mucha ayuda hice los cambios y me funciono perfecto...

Gracias y perdón por la inexperiencia.

Etiquetas: procedimiento, select, sql, almacenar
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 17:30.