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 originalmysql
> SELECT @A
:=0, @A
, @A
:=23, @A
, @A
:=1, @A
, @A
:=37, @A
, @A
:=0, @A
, @A
:=10000, @A
;+-------+------+--------+------+-------+------+--------+------+-------+------+-----------+-------+
| @A:=0 | @A | @A:=23 | @A | @A:=1 | @A | @A:=37 | @A | @A:=0 | @A | @A:=10000 | @A |
+-------+------+--------+------+-------+------+--------+------+-------+------+-----------+-------+
| 0 | 0 | 23 | 23 | 1 | 1 | 37 | 37 | 0 | 0 | 10000 | 10000 |
+-------+------+--------+------+-------+------+--------+------+-------+------+-----------+-------+
- 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 originalDELIMITER$$
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`)
DELIMITER;