Ver Mensaje Individual
  #2 (permalink)  
Antiguo 26/07/2011, 05:55
Avatar de gnzsoloyo
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: 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)