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

Result consisted of more than one row

Estas en el tema de Result consisted of more than one row en el foro de Mysql en Foros del Web. Buenas tardes, tengo este error Result consisted of more than one row quien puede ayudarme? Saludos Código: CREATE DEFINER=`db`@`%` PROCEDURE `usp_LupaPersonal`( IN pCodigo VARCHAR(50), IN ...
  #1 (permalink)  
Antiguo 24/07/2012, 11:46
 
Fecha de Ingreso: noviembre-2007
Mensajes: 37
Antigüedad: 16 años, 11 meses
Puntos: 0
Result consisted of more than one row

Buenas tardes, tengo este error Result consisted of more than one row quien puede ayudarme?

Saludos

Código:
CREATE DEFINER=`db`@`%` PROCEDURE `usp_LupaPersonal`(
    IN pCodigo VARCHAR(50),
    IN pNombre VARCHAR(200),
    IN pTipo CHAR(1),
    IN pUsuario VARCHAR(50)
)
BEGIN

    DECLARE vPlanta INT;
    DECLARE vTipo CHAR(1);
    DECLARE vAdmin INT;

    SET vAdmin = 0;
    SET vPlanta = 0;
    SET vTipo = '@';
    
    SELECT p.plantaid, p.tipo
    INTO vPlanta, vTipo
    FROM seguridad.usuario u
        INNER JOIN db.personal p ON u.personalid = p.personalid
    WHERE
        u.usuario = pUsuario;
    
    IF((vTipo IS NOT NULL) AND (vTipo = 'M')) THEN
        SET vAdmin = 1;
    END IF;
    
    SELECT personalid, codigo, CONCAT(nombres, ' ', apellidos) nombre,
        estado,
        CASE
            WHEN tipo = 'A' THEN 'Auxiliar'
            WHEN tipo = 'V' THEN 'Vendedor'
            WHEN tipo = 'E' THEN 'Encargado'
            WHEN tipo = 'M' THEN 'Administrativo'
            WHEN tipo = 'R' THEN 'Repartidor'
        END AS tipo
    FROM db.personal
    WHERE
    tipo = pTipo
    AND estado = 'A'
    AND UPPER(codigo) LIKE pCodigo
    AND UPPER(CONCAT(nombres, ' ', apellidos)) LIKE pNombre
    AND ((vAdmin = 1) OR (plantaid = vPlanta));

END $$

Última edición por palmach; 24/07/2012 a las 12:19
  #2 (permalink)  
Antiguo 24/07/2012, 13:10
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, 11 meses
Puntos: 2658
Respuesta: Result consisted of more than one row

Dos cosas:
1) Esta parte del código debe estar devolviendo más de un registro:
Código MySQL:
Ver original
  1. SELECT p.plantaid, p.tipo
  2.     INTO vPlanta, vTipo
  3.     FROM seguridad.usuario u
  4.         INNER JOIN db.personal p ON u.personalid = p.personalid
  5.     WHERE
  6.         u.usuario = pUsuario;

Por lo que evidentmente ese INNER JOIN está leyendo una relación 1:N o N:N. En cualquier caso, el problema es que los parámetros no permiten discriminar un único registro, como exige la sintaxis.

2) Este bloque es ineficiente:
Código MySQL:
Ver original
  1. WHEN tipo = 'A' THEN 'Auxiliar'
  2.     WHEN tipo = 'V' THEN 'Vendedor'
  3.     WHEN tipo = 'E' THEN 'Encargado'
  4.     WHEN tipo = 'M' THEN 'Administrativo'
  5.     WHEN tipo = 'R' THEN 'Repartidor'
Cuando tienes que hacer algo así es muchísimo más simple y eficiente crear una tabla con las categorías, donde tengas las decripción e identificador de cada una, y realizar un INNER JOIN que devuelva ese dato.
Además, eso aporta flexibilidad al sistema, porque te permite agregar categorías neuvas sin necesidad de tener que editar todos y cada uno de los SP y las consultas donde usas esta sintaxis tan tosca.
Esto no lo invento yo, es la forma en que se resuelven siempre estas cosas en los sistemas diseñados de modo eficiente.
__________________
¿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 24/07/2012, 13:14
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 9 meses
Puntos: 447
Respuesta: Result consisted of more than one row

Hola palmach:

Creo que el problema está en esta consulta:

Código:
SELECT p.plantaid, p.tipo
  INTO vPlanta, vTipo
FROM seguridad.usuario u
  INNER JOIN db.personal p ON u.personalid = p.personalid
WHERE
  u.usuario = pUsuario;
Si quitas la parte en rojo y ejecutas la consulta te puedo asegurar que regresa más de un registro, por lo tanto al poner el INTO, mysql no puede determinar qué valores son los que tiene que asignar a las variables... tienes que asegurar que el SELECT te regrese UN SOLO REGISTRO. Observa este ejemplo:

Código MySQL:
Ver original
  1. mysql> SET @id = 0;
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> SET @descripcion = '';
  5. Query OK, 0 rows affected (0.00 sec)
  6.  
  7. mysql> SELECT * from Tabla;
  8. +------+-------------+
  9. | id   | descripcion |
  10. +------+-------------+
  11. |    1 | uno         |
  12. |    2 | dos         |
  13. |    3 | tres        |
  14. +------+-------------+
  15. 3 rows in set (0.00 sec)
  16.  
  17. mysql> SELECT id, descripcion INTO @id, @descripcion
  18.     -> FROM tabla;
  19. ERROR 1172 (42000): Result consisted of more than one row
  20.  
  21. mysql> SELECT id, descripcion INTO @id, @descripcion
  22.     -> FROM tabla
  23.     -> LIMIT 1;
  24. Query OK, 1 row affected (0.00 sec)
  25.  
  26. mysql> select @id, @descripcion;
  27. +------+--------------+
  28. | @id  | @descripcion |
  29. +------+--------------+
  30. |    1 | uno          |
  31. +------+--------------+
  32. 1 row in set (0.00 sec)

Observa que el primer SELECT con INTO trataría de asignar tres registros a las variables... en el segundo caso, al poner LIMIT 1 no hay problema

Dale un vistazo y nos comentas.


Cita:
Nuevamente gnzsoloyo se adelantó con la respuesta jejeje... saludos
Saludos
Leo.
  #4 (permalink)  
Antiguo 24/07/2012, 13:17
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, 11 meses
Puntos: 2658
Respuesta: Result consisted of more than one row



Aunque ultimamente te me has adelantado casi iempre...

__________________
¿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 24/07/2012, 14:23
 
Fecha de Ingreso: noviembre-2007
Mensajes: 37
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: Result consisted of more than one row

Gracias Leo tienes razon al poner Limit 1 ya me regresa valores.

Saludos,

Etiquetas: join, result, row, select, tipo
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 00:58.