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

No devuelve nada!!!

Estas en el tema de No devuelve nada!!! en el foro de Mysql en Foros del Web. Hola!!! tengo esta consulta, el punto es que no me devuelve ningún valor y no se por que puede ser, si la tabla si esta ...
  #1 (permalink)  
Antiguo 25/07/2011, 22:49
Avatar de JeMaGa  
Fecha de Ingreso: julio-2011
Ubicación: Bogota
Mensajes: 430
Antigüedad: 8 años, 4 meses
Puntos: 4
Pregunta No devuelve nada!!!

Hola!!! tengo esta consulta, el punto es que no me devuelve ningún valor y no se por que puede ser, si la tabla si esta llena agradezco toda su ayuda si pueden!!

SELECT `Nombre_Persona` FROM `personas` INNER JOIN `firma_conocimiento` ON `personas`.`Cod.persona` = `firma_conocimiento`.`Cod.persona` WHERE `Cod.Doc`='SAC-0111';


y tengo este procedimiento el cual quiero que me inserte tomando unos valores y uno de esos valores viene siendo el id del Nombre_Persona Agrego el @ en la variables por que en SQLyog diferencia así las variables


CREATE PROCEDURE `documentacion`.`firmar`(IN `@Codigo` VARCHAR(20), IN `@Version` INT, IN `@idNombre` INT , IN `@Fecha` DATE)
BEGIN
SET `@idNombre` = (SELECT `Nombre_Persona` FROM `personas` INNER JOIN `firma_conocimiento` ON `personas`.`Cod.persona` = `firma_conocimiento`.`Cod.persona` WHERE `Cod.Doc`='SAC-0313');
INSERT INTO `firma_conocimiento` (`Cod.Doc`,`Version`, `Cod.Persona`,`Fecha`)
VALUES(`@Codigo`,`@Version`,`@idNombre`, NOW());


Gracias por su ayuda!!!
  #2 (permalink)  
Antiguo 26/07/2011, 06:55
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.321
Antigüedad: 12 años
Puntos: 2653
Respuesta: No devuelve nada!!!

Hay algunos detalles que necesitas saber:
1) Las variables locales y del prototipo de un stored procedure en MySQL no llevan "@". Eso se usa en SQL Server, pero no en éste. En MySQL las variables locales se declaran y las del prototipo van sin declarar, pero son accesibles en el cuerpo del SP.
2) El "@" se usa sólo en las variables de usuario, las cuales no dependen de los SP, sino que son variables que el usuario define en una conexión dada y que tienen estas características:
  • No tienen tipo, por lo que para que lo adquieran deben ser inicializadas con algún valor.
  • Si no se las inicializa, su valor es NULL y rigen las reglas de NULLs.
  • Existen sólo dentro de la conexión en que se las usa y mueren cuando la conexión cierra. Como dependen de ella, y la conexión sólo puede ser de un único user, dos conexiones del mismo user pueden usar variables del mismo nombre sin generar conflictos.
  • Conservan el último valor que se les asigne, sin importar el contexto en que se usen, y pueden ser usadas dentro y fuera de los SP sin problemas.
  • Pueden usarse dentro de una sentencia para que tome alternativamente valores, pero debe usarse ":=" para las asignaciones y como cada asignación cambia su valor, se pueden dar casos como:
Código MySQL:
Ver original
  1. mysql> SELECT @A:=0,  @A, @A:=23, @A, @A:=1,  @A, @A:=37,  @A, @A:=0,  @A, @A:=10000, @A;
  2. +-------+------+--------+------+-------+------+--------+------+-------+------+-----------+-------+
  3. | @A:=0 | @A   | @A:=23 | @A   | @A:=1 | @A   | @A:=37 | @A   | @A:=0 | @A   | @A:=10000 | @A    |
  4. +-------+------+--------+------+-------+------+--------+------+-------+------+-----------+-------+
  5. |     0 | 0    |     23 | 23   |     1 | 1    |     37 | 37   |     0 | 0    |     10000 | 10000 |
  6. +-------+------+--------+------+-------+------+--------+------+-------+------+-----------+-------+
  7. 1 row in set (0.05 sec)
  • como puedes observar, en cada asignación, incluso en la misma línea, el valor va cambiando y el resultado final es que @A vale 10000.
  • Esta particularidad permite hacer sentencias dinámicas bastante creativas.
  • No se pueden poner dentro del código de una vista (VIEW), pero si dentro de un SP.

3) El acento inverso se usa sólo para los nombres de :
  • bases de datos,
  • tablas,
  • columnas,
  • triggers,
  • stored procedures
  • stored functions,
  • alias
4) No se usan jamás para los nombres de variables.
5) El cuerpo de un SP de más de una sentencia debe ir siempre entre las cláusulas BEGIN/END.
6) Si el script se cargará con MySQL Query Browser o por consola, deben usarse cambios de DELIMITER para que se cargue como un sólo bloque. No se requiere si se hará por programación en lenguajes.

En definitiva, el SP, para ser funcional, sería mas o menos así:
Código MySQL:
Ver original
  1. DELIMITER$$
  2. DROP PROCEDURE IF EXISTS `firmar`$$
  3. CREATE PROCEDURE `documentacion`.`firmar`(
  4.   IN Codigo VARCHAR(20),
  5.   IN idNombre INT,
  6.   IN Fecha DATE)
  7.   SET idNombre = (SELECT `Nombre_Persona`
  8.                   FROM `personas` P INNER JOIN `firma_conocimiento` FC ON `P`.`Cod.persona` = `FC`.`Cod.persona`
  9.                   WHERE `Cod.Doc`='SAC-0313');
  10.   INSERT INTO `firma_conocimiento` (`Cod.Doc`,`Version`, `Cod.Persona`,`Fecha`)
  11.   VALUES(Codigo,Version, idNombre, NOW());
  12. END$$
  13.  
  14. DELIMITER;
__________________
¿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 26/07/2011, 06:58
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.321
Antigüedad: 12 años
Puntos: 2653
Respuesta: No devuelve nada!!!

La consulta que pones no tiene ningún error sintáctico:
Código MySQL:
Ver original
  1.     `Nombre_Persona`
  2.     `personas` P
  3.     INNER JOIN
  4.     `firma_conocimiento` FC ON `P`.`Cod.persona` = `FC`.`Cod.persona`
  5.     `Cod.Doc`='SAC-0111';
Si no devuelve datos es porque no hay ningún registro que cumpla con el INNER JOIN y el WHERE dados.
Pruba consultando sin la condición del WHERE y verifica manualmente si hay algún registro donde sea `Cod.Doc`='SAC-0111'. De lo contrario, debería devolver un error de alguna clase.
__________________
¿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 26/07/2011, 07:32
Avatar de JeMaGa  
Fecha de Ingreso: julio-2011
Ubicación: Bogota
Mensajes: 430
Antigüedad: 8 años, 4 meses
Puntos: 4
Respuesta: No devuelve nada!!!

Cita:
Iniciado por gnzsoloyo Ver Mensaje
En definitiva, el SP, para ser funcional, sería mas o menos así:
Código MySQL:
Ver original
  1. DELIMITER$$
  2. DROP PROCEDURE IF EXISTS `firmar`$$
  3. CREATE PROCEDURE `documentacion`.`firmar`(
  4.   IN Codigo VARCHAR(20),
  5.   IN idNombre INT,
  6.   IN Fecha DATE)
  7.   SET idNombre = (SELECT `Nombre_Persona`
  8.                   FROM `personas` P INNER JOIN `firma_conocimiento` FC ON `P`.`Cod.persona` = `FC`.`Cod.persona`
  9.                   WHERE `Cod.Doc`='SAC-0313');
  10.   INSERT INTO `firma_conocimiento` (`Cod.Doc`,`Version`, `Cod.Persona`,`Fecha`)
  11.   VALUES(Codigo,Version, idNombre, NOW());
  12. END$$
  13.  
  14. DELIMITER;

esto me inserta pero no me toma el id del nombre que ingrese es decir me esta insertando pero no todos los datos, me inserta todo menos el Cod.Persona.
  #5 (permalink)  
Antiguo 26/07/2011, 07:46
Avatar de JeMaGa  
Fecha de Ingreso: julio-2011
Ubicación: Bogota
Mensajes: 430
Antigüedad: 8 años, 4 meses
Puntos: 4
Pregunta Respuesta: No devuelve nada!!!

oye y disculpa pedir tanta ayuda pero yo se lo basico de base de datos y eso, entonces te queria pedir otro favor es que me sale mas de un registro, pero no se como indicarle que memuestre solo un nombre mira me sale este error

DELIMITER $$
USE `documentacion`$$
DROP PROCEDURE IF EXISTS `firmar`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `firmar`(IN `Codigo` VARCHAR(20),IN `Version` INT,IN `idNombre` INT,IN `Fecha` DATE)
BEGIN
SET idNombre = (SELECT `Nombre_Persona` FROM `personas` P INNER JOIN`firma_conocimiento` FC ON `P`.`Cod.persona` = `FC`.`Cod.persona`
WHERE `Cod.Doc`='SAC-0313');
INSERT INTO `firma_conocimiento` (`Cod.Doc`,`Version`, `Cod.Persona`,`Fecha`) VALUES(`Codigo`,`Version`, `idNombre`, NOW());
END$$
DELIMITER ;


Query : call `firmar`('SAC-0313',4,'Claudia Cruz',NOW())

Error Code : 1242
Subquery returns more than 1 row


GRACIAS
  #6 (permalink)  
Antiguo 26/07/2011, 08:35
Avatar de JeMaGa  
Fecha de Ingreso: julio-2011
Ubicación: Bogota
Mensajes: 430
Antigüedad: 8 años, 4 meses
Puntos: 4
Respuesta: No devuelve nada!!!

Ya muchas gracis!!!
  #7 (permalink)  
Antiguo 26/07/2011, 08:40
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.321
Antigüedad: 12 años
Puntos: 2653
Respuesta: No devuelve nada!!!

Cita:
Error Code : 1242
Subquery returns more than 1 row
Eso significa que la consulta
Código MySQL:
Ver original
  1. SELECT `Nombre_Persona`
  2. FROM `personas` P
  3. INNER JOIN`firma_conocimiento` FC ON `P`.`Cod.persona` = `FC`.`Cod.persona`
  4. WHERE `Cod.Doc`='SAC-0313'
devuelve más de un registro.

Verifica el contenido de la tabla. usando, como ya te mencioné, la sentencia sin el WHERE:
Código MySQL:
Ver original
  1. SELECT `Nombre_Persona`
  2. FROM `personas` P
  3. INNER JOIN`firma_conocimiento` FC ON `P`.`Cod.persona` = `FC`.`Cod.persona`;

Puede haber basura de las pruebas anteriores.

Respecto al SP, ¿hay alguna parte que no se entendiera cuando dije que las variables del prototipo no deben estar entre acentos inversos?.
Esto:
Código MySQL:
Ver original
  1. CREATE DEFINER=`root`@`localhost` PROCEDURE `firmar`(IN `Codigo` VARCHAR(20),IN `Version` INT,IN `idNombre` INT,IN `Fecha` DATE)

Debe ir así:
Código MySQL:
Ver original
  1. CREATE DEFINER=`root`@`localhost` PROCEDURE `firmar`(IN Codigo VARCHAR(20), IN Version INT, IN idNombre INT, IN Fecha DATE)

Y esto:
Código MySQL:
Ver original
  1. INSERT INTO `firma_conocimiento` (`Cod.Doc`,`Version`, `Cod.Persona`,`Fecha`)
  2. VALUES(`Codigo`,`Version`, `idNombre`, NOW());
debe ir así:
Código MySQL:
Ver original
  1. INSERT INTO `firma_conocimiento` (`Cod.Doc`,`Version`, `Cod.Persona`,`Fecha`)
  2. VALUES(Codigo, Version, idNombre, Fecha);
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 26/07/2011, 08:47
Avatar de JeMaGa  
Fecha de Ingreso: julio-2011
Ubicación: Bogota
Mensajes: 430
Antigüedad: 8 años, 4 meses
Puntos: 4
Respuesta: No devuelve nada!!!

sI ya puede muchas gracias por tu ayuda!! :)
  #9 (permalink)  
Antiguo 26/07/2011, 08:53
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.321
Antigüedad: 12 años
Puntos: 2653
Respuesta: No devuelve nada!!!

__________________
¿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: devuelve, join, 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 07:37.