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

[SOLUCIONADO] procedimiento almacenado mysql

Estas en el tema de procedimiento almacenado mysql en el foro de Mysql en Foros del Web. buenos dias a todos les traigo una consulta que he buscado la sulucion por varios dias y no he podido continuar. utilizo XAMP Servidor: 127.0.0.1 ...
  #1 (permalink)  
Antiguo 15/04/2015, 11:31
 
Fecha de Ingreso: abril-2015
Ubicación: MEDELLIN
Mensajes: 6
Antigüedad: 9 años, 7 meses
Puntos: 0
procedimiento almacenado mysql

buenos dias a todos
les traigo una consulta que he buscado la sulucion por varios dias y no he podido continuar.
utilizo XAMP

Servidor: 127.0.0.1 via TCP/IP
Tipo de servidor: MySQL
Versión del servidor: 5.6.20 - MySQL Community Server (GPL)
Versión del protocolo: 10
Usuario: root@localhost
Conjunto de caracteres del servidor: UTF-8 Unicode (utf8)


lo que pasa es que estoy actualmente realizando un proyecto para la u el cual lo estoy haciendo en php y mysql con procedimientos almacenados.

mi problema es que he realizado dos procedimientos almacenados para la administracion de usuarios y son los siguientes;

Código SQL:
Ver original
  1. CREATE DEFINER=`root`@`localhost` PROCEDURE `gestion_usuarios`(
  2. IN Usu_codigo INT,
  3. IN Usu_nombre1 VARCHAR(25),
  4. IN Usu_apellidos1 VARCHAR(25),
  5. IN Usu_celular1 VARCHAR(25),
  6. IN Usu_correo1 VARCHAR(25),
  7. IN Usu_telefono1 VARCHAR(25),
  8. IN Usu_direccion1 VARCHAR(25),
  9. IN Usu_nombre_usu VARCHAR(25),
  10. IN Usu_contrasena VARCHAR(25)
  11. )
  12. BEGIN
  13. /*insertar*/
  14. IF((Usu_codigo IS NULL)OR(Usu_codigo='')OR(Usu_codigo=0))THEN
  15. IF((Usu_nombre1<>'')AND(Usu_apellidos1<>''))THEN
  16. /*insertar*/
  17. INSERT INTO `cinemax`.`tbl_usuarios`(usu_nombre,usu_apellidos, usu_celular,usu_email,usu_telefono,usu_direccion,u su_nombre_usu,usu_contrasena)
  18. VALUES(Usu_nombre1,Usu_apellidos1,Usu_celular1,Usu _correo1,Usu_telefono1,Usu_direccion1,Usu_nombre_u su,Usu_contrasena);
  19. SELECT 'se guardo';
  20. END IF;
  21. END IF;
  22. /*eliminar*/
  23. IF((Usu_codigo<>'')OR(Usu_codigo<>NULL))AND((Usu_n ombre1='')AND(Usu_apellidos1='')AND(Usu_celular1=' ')AND(Usu_correo1='')AND(Usu_telefono1='')AND(Usu_ direccion1='')AND(Usu_nombre_usu='')AND(Usu_contra sena=''))THEN
  24. DELETE FROM `cinemax`.`tbl_usuarios` WHERE `usu_cod`=Usu_codigo;
  25. SELECT 'se borro';
  26. /*modificar*/
  27. elseif((Usu_codigo<>'')OR(Usu_codigo<>NULL)OR(Usu_ codigo<>0))THEN
  28. IF((Usu_nombre1<>'')AND(Usu_apellidos1<>'')AND(Usu _celular1<>'')AND(Usu_correo1<>'')AND(Usu_telefono 1<>'')AND(Usu_direccion1<>'')AND(Usu_nombre_usu<>' ')AND(Usu_contrasena<>''))THEN
  29. UPDATE `cinemax`.`tbl_usuarios` SET usu_nombre=Usu_nombre1, usu_apellidos=Usu_apellidos1, usu_celular=Usu_celular1, usu_email=Usu_correo1, usu_telefono=Usu_telefono1, usu_direccion=Usu_direccion1, usu_nombre_usu=Usu_nombre_usu, usu_contrasena=Usu_contrasena WHERE usu_cod=Usu_codigo;
  30. SELECT 'se actualizo';
  31. END IF;
  32. END IF;
  33. END$$
  34.  
  35. DELIMITER ;

este procedimiento lo que hace es que inserta modifica o elimina usuarios de una tabla.... este es mi primer procedimiento y funciona perfecto.....

pero mi problema es que trate de crear otro procedimiento para lo empleados:

Código MySQL:
Ver original
  1. CREATE DEFINER=`root`@`localhost` PROCEDURE `gestion_empleados`(
  2. in Emp_codigo int,
  3. in Emp_cedula int,
  4. in Emp_nombre1 varchar(25),
  5. in Emp_apellidos1 varchar(25),
  6. in Emp_telefono1 varchar(25),
  7. in Emp_direccion1 varchar (25),
  8. in Emp_email1 varchar(25),
  9. in Emp_celular1 varchar (25),
  10. in Emp_descripcion1 varchar(25),
  11. in Emp_nombre_usu1 varchar(25),
  12. in Emp_contrasena1 varchar (25)
  13. )
  14. if((Emp_codigo='')or(Emp_codigo=NULL)or(Emp_codigo =0))then
  15. if((Emp_cedula<>'')and(Emp_nombre1<>'')and(Emp_ape llidos1<>'')and(Emp_telefono1<>''))then
  16. INSERT INTO `cinemax`.`tbl_empleados` (`emp_cedula`, `emp_nombre`, `emp_apellidos`, `emp_telefono`, `emp_direccion`, `emp_email`, `emp_celular`, `emp_descripcion`, `emp_nombre_usu`, `emp_contrasena`)
  17. VALUES (Emp_cedula,Emp_nombre1,Emp_apellidos1,Emp_telefon o1,Emp_direccion1,Emp_email1,Emp_celular1,Emp_desc ripcion1,Emp_nombre_usu1,Emp_contrasena1);
  18. SELECT 'se guardo';
  19. /*eliminar*/
  20. if((Emp_codigo<>'')or(Emp_codigo<>NULL))and((Emp_c edula='')and(Emp_nombre1='')and(Emp_apellidos1='') and(Emp_telefono1='')and(Emp_direccion1='')and(Emp _email1='')and(Emp_celular1='')and(Emp_descripcion 1='')and(Emp_nombre_usu1='')and(Emp_contrasena1='' ))then
  21. DELETE FROM `cinemax`.`tbl_empleados` WHERE `emp_codigo`=Emp_codigo;
  22. SELECT 'se borro';
  23. /*modificar*/
  24. elseif((Emp_codigo<>'')or(Emp_codigo<>NULL)or(Emp_ codigo<>0))then
  25. if((Emp_cedula<>'')and(Emp_nombre1<>'')and(Emp_ape llidos1<>'')and(Emp_telefono1<>'')and(Emp_direccio n1<>'')and(Emp_email1<>'')and(Emp_celular1<>'')and (Emp_descripcion1<>'')and(Emp_nombre_usu1<>'')and( Emp_contrasena1<>''))then
  26. UPDATE `cinemax`.`tbl_empleados` SET `emp_cedula`=Emp_cedula, `emp_nombre`=Emp_nombre1, `emp_apellidos`=Emp_apellidos1, `emp_telefono`=Emp_telefono1, `emp_direccion`=Emp_direccion1, `emp_email`=Emp_email1, `emp_celular`=Emp_celular1, `emp_descripcion`=Emp_descripcion1, `emp_nombre_usu`=Emp_nombre_usu1, `emp_contrasena`=Emp_contrasena1 WHERE `emp_codigo`=Emp_codigo;
  27. select'se actualizo';


el cual deberia de hacer la misma funcion que el otro procedimiento que es insertar modificar y eliminar los empleados de una tabla.... el error puntual es que el procedimiento de empleados inserta bien a la tabla pero cuando trato de eliminar o modificar un empleado se elimina o se modifica toda la tabla es decir
que la sentencia DELETE FROM `cinemax`.`tbl_empleados` WHERE `emp_codigo`=Emp_codigo; el where no funciona y elimina tdo....

en el caso de modificar:
Código MySQL:
Ver original
  1. UPDATE `cinemax`.`tbl_empleados` SET `emp_cedula`=Emp_cedula,
  2. `emp_nombre`=Emp_nombre1, `emp_apellidos`=Emp_apellidos1, `emp_telefono`=Emp_telefono1,
  3. `emp_direccion`=Emp_direccion1, `emp_email`=Emp_email1, `emp_celular`=Emp_celular1,
  4. `emp_descripcion`=Emp_descripcion1, `emp_nombre_usu`=Emp_nombre_usu1,
  5. `emp_contrasena`=Emp_contrasena1 WHERE `emp_codigo`=Emp_codigo;

me modifica todos los usuarios y no entiendo el por que elimina y modifica todos lo usuarios si las dos sentencial llevan consigo la clausula WHERE...


para concluir quiero decir que he revisado los campos de las tablas y son identicos, es decir si el campo es entero el procedimiento lleva una variable entera

he tratado de eliminar el procedimiento varias veces y volverlo a crear pero pasa lo mismo
es mas e migrado la base de datos para otro equipo y tampoko funciona el procedimiento, lo uniko que funciona es el insertar empleado, por que me elimina toda la tabla y me modifica toda la tabla como si no tuviera un WHERE


espero me ayuden y muchas gracias

Última edición por gnzsoloyo; 15/04/2015 a las 12:05
  #2 (permalink)  
Antiguo 15/04/2015, 11:59
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: procedimiento almacenado mysql

ya comprobaste que el parametro se esta enviando de manera correcta? parece ser que no llega ningun parametro en el where por eso no te respeta el mismo.....
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 15/04/2015, 12:10
 
Fecha de Ingreso: abril-2015
Ubicación: MEDELLIN
Mensajes: 6
Antigüedad: 9 años, 7 meses
Puntos: 0
Sonrisa Respuesta: procedimiento almacenado mysql

gracias por responder.....el si segundo procedimiento necesita 11 parametros y se los envio todos y aun asi me elimina todo o me l modifica todo como si no existiera el WHERE
mira la sentencia
Código MySQL:
Ver original
  1. call cinemax.gestion_empleados(7, 354, 'dsfgdgdgfdf', 'dfgdfg', 'retert', 'retert', 'ertert', 'tre', 'ertreteter', '111', '111');
en este caso me actualiza toda la tabla
  #4 (permalink)  
Antiguo 15/04/2015, 12:34
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: procedimiento almacenado mysql

Tu código tiene varios defectos de lógica, pero el mas grave es que estas validando en el WHERE un campo contra el propio campo, por lo que siempre dará TRUE y te borrará todo.
Es un erro muy común, porque debes entender que MySQL no puede saber que el nombre de una variable representa un objeto diferente al de un campo. Para MySQL estás indicando el nombre del campo, no una variable.
Lo que debes hacer es siempre poner los nomrbes de variables distintos a lso de los campos, bases o tablas, ya que el analisis semántido ce MySQ reconoce los objetos por jerarquía, y una columna se prioriza sobre una variable...
¿Se entiende?
Además de eso, estás haciendo consultas complicadas en los IF... THEN, y no suficientemente discriminante, con un uso incorrecto del operador "=" con NULL, donde en MySQL no puede aplciarse, porque NULL no es un dato sino un estado.
Ese comportamiento es diferente de Oracle, por ejemplo.

Esta sería una priemra sugerencia:
Código MySQL:
Ver original
  1. CREATE PROCEDURE `gestion_empleados`(
  2. in Emp_codigo1 int,
  3. in Emp_cedula1 int,
  4. in Emp_nombre1 varchar(25),
  5. in Emp_apellidos1 varchar(25),
  6. in Emp_telefono1 varchar(25),
  7. in Emp_direccion1 varchar (25),
  8. in Emp_email1 varchar(25),
  9. in Emp_celular1 varchar (25),
  10. in Emp_descripcion1 varchar(25),
  11. in Emp_nombre_usu1 varchar(25),
  12. in Emp_contrasena1 varchar (25)
  13. )
  14.     IF (SELECT  COUNT(*)
  15.            FROM `cinemax`.`tbl_empleados`
  16.         WHERE   Emp_cedula = Emp_cedula1
  17.             AND Emp_nombre = Emp_nombre1
  18.             AND Emp_apellidos = Emp_apellidos1<>''
  19.             AND Emp_telefono = Emp_telefono1<>'') = 0 THEN
  20.            
  21.             INSERT INTO `cinemax`.`tbl_empleados`
  22.                 (`emp_cedula`,
  23.                 `emp_nombre`,
  24.                 `emp_apellidos`,
  25.                 `emp_telefono`,
  26.                 `emp_direccion`,
  27.                 `emp_email`,
  28.                 `emp_celular`,
  29.                 `emp_descripcion`,
  30.                 `emp_nombre_usu`,
  31.                 `emp_contrasena`)
  32.             VALUES (
  33.                 Emp_cedula1,
  34.                 Emp_nombre1,
  35.                 Emp_apellidos1,
  36.                 Emp_telefono1,
  37.                 Emp_direccion1,
  38.                 Emp_email1,
  39.                 Emp_celular1,
  40.                 Emp_descripcion1,
  41.                 Emp_nombre_usu1,
  42.                 Emp_contrasena1);
  43.             SELECT 'se guardo';
  44.         END if;
  45.     END IF;
  46.     /*eliminar*/
  47.     IF(Emp_codigo > 0 AND (SELECT COUNT(*) FROM `cinemax`.`tbl_empleados` WHERE `emp_codigo` = Emp_codigo1) = 1
  48.             AND Emp_c edula=''
  49.             AND Emp_nombre1=''
  50.             AND Emp_apellidos1=''
  51.             AND Emp_telefono1=''
  52.             AND Emp_direccion1=''
  53.             AND Emp_email1=''
  54.             AND Emp_celular1=''
  55.             AND Emp_descripcion 1=''
  56.             AND Emp_nombre_usu1=''
  57.             AND Emp_contrasena1='' ) THEN
  58.         DELETE FROM `cinemax`.`tbl_empleados` WHERE `emp_codigo` = Emp_codigo1;
  59.         SELECT 'se borro';
  60.     /*modificar*/
  61.     elseif(Emp_codigo > 0 AND (SELECT COUNT(*) FROM `cinemax`.`tbl_empleados` WHERE `emp_codigo` = Emp_codigo1) = 1
  62.             AND Emp_cedula1<>''
  63.             AND Emp_nombre1<>''
  64.             AND Emp_ape llidos1<>''
  65.             AND Emp_telefono1<>''
  66.             AND Emp_direccio n1<>''
  67.             AND Emp_email1<>''
  68.             AND Emp_celular1<>''
  69.             AND Emp_descripcion1<>''
  70.             AND Emp_nombre_usu1<>''
  71.             AND Emp_contrasena1<>'') THEN
  72.            
  73.             UPDATE `cinemax`.`tbl_empleados`
  74.             SET `emp_cedula`=Emp_cedula1,
  75.                 `emp_nombre`=Emp_nombre1,
  76.                 `emp_apellidos`=Emp_apellidos1,
  77.                 `emp_telefono`=Emp_telefono1,
  78.                 `emp_direccion`=Emp_direccion1,
  79.                 `emp_email`=Emp_email1,
  80.                 `emp_celular`=Emp_celular1,
  81.                 `emp_descripcion`=Emp_descripcion1,
  82.                 `emp_nombre_usu`=Emp_nombre_usu1,
  83.                 `emp_contrasena`=Emp_contrasena1
  84.             WHERE `emp_codigo`=Emp_codigo1;
  85.             SELECT'se actualizo';
  86.         END IF;
  87.     END IF;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 15/04/2015, 13:38
 
Fecha de Ingreso: abril-2015
Ubicación: MEDELLIN
Mensajes: 6
Antigüedad: 9 años, 7 meses
Puntos: 0
Respuesta: procedimiento almacenado mysql

MUCHAS GRACIAS AMIGO!!!!!!
ya lo solucione, simplemente vi lo que me dijistes de los campos y esa era la solucion.
muchas gracias
  #6 (permalink)  
Antiguo 15/04/2015, 14:08
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: procedimiento almacenado mysql

Me alegra que te sirviera.
De todos ten en cuenta el resto de las observaciones porque la forma en que haces las validaciones puede dar resultaods erróneos inesperados bajo ciertas circunstancias. Además, otras, como evaluar algo como "<>" puede provocar problemas de performance, y evaluar demasiadas condiciones en el IF también.
Trata de no generar cuellos de botella con las validaciones.
__________________
¿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: almacenado, campo, php, procedimiento, select, sql, tabla
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 15:55.