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

[SOLUCIONADO] Problema con procedure en mysql y phpmyadmin

Estas en el tema de Problema con procedure en mysql y phpmyadmin en el foro de Mysql en Foros del Web. Hola que tal, soy novato en esto de los procedures estoy intentando hacer uno para que cada que lo manden llamar este haga una consulta ...
  #1 (permalink)  
Antiguo 16/01/2015, 05:41
 
Fecha de Ingreso: enero-2015
Mensajes: 4
Antigüedad: 9 años, 3 meses
Puntos: 0
Problema con procedure en mysql y phpmyadmin

Hola que tal, soy novato en esto de los procedures estoy intentando hacer uno para que cada que lo manden llamar este haga una consulta a una tabla me regrese el numero de columnas que tiene, lo asigno a una variable hago un while con ese numero
y por cada columna que me regrese hacer un insert en otra tabla, obviamente mi codigo esta mal ya que no le estoy diciendo que columna asigne o como le haga pero estoy perdido, agradeceria cualquier ayuda de antemano gracias este es el codigo que hice que ya se que esta mal :P es solo para ilustrar mi proposito.

Código MySQL:
Ver original
  1. CREATE PROCEDURE historicoPagos(IN correo varchar,IN idc int(20))
  2. DECLARE curso varchar(50);
  3. DECLARE iva int(11);
  4. DECLARE fecha date;
  5. DECLARE banco varchar(30);
  6. DECLARE referencia varchar(50);
  7. DECLARE pagado varchar(2);
  8. DECLARE precioFijado double;
  9. DECLARE nombre varchar(20);
  10. DECLARE apellidoP varchar(20);
  11. DECLARE apellidoM varchar(20);
  12. DECLARE col int(11);
  13.  
  14. SET col = (SELECT pagos.correoPersona FROM pagos WHERE correoPersona like correo AND idcurso = idc);
  15.  
  16. WHILE col > 0 DO
  17.  
  18. SELECT lleva.idmateria,esta.iva,pagos.fechapago,pagos.formadepago,pagos.referencia,pagos.psi,pagos.monto,esta.preciofijado,persona.nombre,persona.apellidop,persona.apellidom
  19. INTO curso,iva,fecha,banco,referencia,psi,monto,precioFijado,nombre,apellidoP,apellidoM
  20. FROM esta
  21. INNER JOIN lleva ON esta.idcurso = lleva.idcursos
  22. INNER JOIN pagos ON (pagos.idcurso = esta.idcurso AND esta.correoAlumno = pagos.correoPersona)
  23. INNER JOIN persona ON (esta.correoAlumno = persona.correoPersona)
  24. WHERE esta.idcurso = idc AND esta.correoAlumno = correo;
  25.  
  26. INSERT INTO pagoseliminados(idCurso, Curso, IVA, FechaPago, Banco, Referencia, PSI, Pagado, TotalPagado, PrecioFijado, CorreoE, Nombre, ApellidoP, ApellidoM)
  27. VALUES(idc,curso,iva,fecha,banco,referencia,psi,"",monto,precioFijado,correo,nombre,apellidoP,apellidoM);
  28.  
  29. SET col = col-1;
  30. END WHILE;
  #2 (permalink)  
Antiguo 16/01/2015, 07:05
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, 4 meses
Puntos: 2658
Respuesta: Problema con procedure en mysql y phpmyadmin

El primer error es que no estás poniendo la dimensión del VARCHAR de entrada. Eso hace que no compile.
El segundo, es que pareces estar obteniendo una columna que es una cadena de texto (correoPersona) para luego tratarla como entero. Al menos no se entiende qué es esa columna.
Por otro lado, sólo tiene sentido un contador cuando recorres un resultado, pero para recorrer resultados debes usar si o si un CURSOR, cosa que no haces.
Además, usas LIKE donde deberías usar "=", ya que un LIKE (que es un asco de performance) sólo tiene sentido si usas comodines para búsqueda de patrones que no es tu caso.

Finalmente, siendo que no haces validaciones con lo obtenido, sino que simplemente insertas lo encontrado, lo más simple es hacer un INSERT INTO.. SELECT... FROM..., como este:

Código MySQL:
Ver original
  1. CREATE PROCEDURE historicoPagos(IN correo VARCHAR(100), IN idc INT(20))
  2.     INSERT INTO pagoseliminados(
  3.         idCurso,
  4.         Curso,
  5.         IVA,
  6.         FechaPago,
  7.         Banco,
  8.         Referencia,
  9.         PSI,
  10.         Pagado,
  11.         TotalPagado,
  12.         PrecioFijado,
  13.         CorreoE,
  14.         Nombre,
  15.         ApellidoP,
  16.         ApellidoM)
  17.     SELECT
  18.         L.idmateria,
  19.         E.iva,
  20.         P.fechapago,
  21.         P.formadepago,
  22.         P.referencia,
  23.         P.psi,
  24.         '',
  25.         P.monto,
  26.         E.preciofijado,
  27.         PE.nombre,
  28.         PE.apellidop,
  29.         PE.apellidom
  30.     FROM esta E
  31.         INNER JOIN lleva L ON E.idcurso = L.idcursos
  32.         INNER JOIN pagos P ON (P.idcurso = E.idcurso AND E.correoAlumno = P.correoPersona)
  33.         INNER JOIN persona PE ON (E.correoAlumno = P.correoPersona)
  34.     WHERE E.idcurso = idc AND E.correoAlumno = correo;
  35.  
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 16/01/2015, 15:31
 
Fecha de Ingreso: enero-2015
Mensajes: 4
Antigüedad: 9 años, 3 meses
Puntos: 0
Respuesta: Problema con procedure en mysql y phpmyadmin

De antemano muchas gracias, ahorita mismo lo pruebo y te comento los resultados de nuevo gracias por marcarme mis errores, es el primero que hago y hace 24 horas no sabia lo que era un procedimiento en mysql :P
  #4 (permalink)  
Antiguo 16/01/2015, 16:06
 
Fecha de Ingreso: enero-2015
Mensajes: 4
Antigüedad: 9 años, 3 meses
Puntos: 0
Respuesta: Problema con procedure en mysql y phpmyadmin

Hola de nuevo, ya realice el procedure y al parecer no hubo problemas, realice el siguiente disparador para llamarlo. cuando una fila de la tabla esta se borre.

Código MySQL:
Ver original
  1.     CALL historicoPagos(OLD.idcurso,OLD.CorreoAlumno);

hasta aqui todo bien ya que phpmyadmin me pone la cabecera sin problemas.

el problema es que cuando intento elimianar un registro en la tabla esta para ver si funciona el disparador y el procedimiento me dice lo sieguiente:

#1267 Illegal mix of collations (utf8_spanish_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '='

ya revise todas las tablas y todas estan codificadas con el mismo juego de caracteres no se como solucionarlo y buscando en la red tampoco encontre solucion gracias.

Última edición por gnzsoloyo; 16/01/2015 a las 20:01
  #5 (permalink)  
Antiguo 16/01/2015, 20: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, 4 meses
Puntos: 2658
Respuesta: Problema con procedure en mysql y phpmyadmin

Cita:
ya revise todas las tablas y todas estan codificadas con el mismo juego de caracteres
Bueno, en realidad deben, forzosamente, tener alguna diferencia. MySQL no se equivoca...

Lamentablemente no puedo saber cuál es la diferencia que existe sin ver la estructura de las tablas por lo que tendrás que postar al menos la que se accede en ese SP.
Eso lo puedes obtener así:
Código MySQL:
Ver original
  1. SHOW CREATE TABLE pagoseliminados;
A lo que resulte de eso habrá que verificarlo contra la collation usada por el SP, y el tipo de dato obtenido en la llamada del trigger.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 16/01/2015, 22:14
 
Fecha de Ingreso: enero-2015
Mensajes: 4
Antigüedad: 9 años, 3 meses
Puntos: 0
Respuesta: Problema con procedure en mysql y phpmyadmin

Hola mil gracias por darte el tiempo de responder encontre el error que tenia, era que en el ultimo inner join en vez de PE.correoPersona, le pusiste P.correoPersona por lo que generaba mas columnas de las que yo requeria corregi ese pequeño error de dedo cambie unas restricciones y voilà muchas gracias por todo fue de gran ayuada.

Etiquetas: phpmyadmin, procedure, programación-general
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 10:02.